python玩转信号处理与机器学习入门
Posted MomodelAI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python玩转信号处理与机器学习入门相关的知识,希望对你有一定的参考价值。
01 介绍
本部分将介绍FFT,PSD,auto-correlation的基本概念以及python代码实现。
1 混合信号
图1 信号在时域上的表现
图2 信号在频域上的表现
from scipy.fftpack import fft
def get_fft_values(y_values, N, f_s):
f_values = np.linspace(0.0, f_s/2.0, N//2)
fft_values_ = fft(y_values)
fft_values = 2.0/N * np.abs(fft_values_[0:N//2])
return f_values, fft_values
from scipy.signal import welch
def get_psd_values(y_values, N, f_s):
f_values, psd_values = welch(y_values, fs=f_s)
return f_values, psd_values
def autocorr(x):
result = np.correlate(x, x, mode='full')
return result[len(result)//2:]
def get_autocorr_values(y_values, N, f_s):
autocorr_values = autocorr(y_values)
x_values = np.array([ 1.0*jj/f_s for jj in range(0, N)])
return x_values, autocorr_values
02 实例
经过上面的简单介绍相信你已经了解并掌握了信号在频域上的变换。接下来让我们运用刚学的知识结合机器学习知识来分析一个实例 Human Activity Recognition Using Smartphones Data Set。
该数据集通过在30个不同年龄分布的志愿者上做实验采集得到,在志愿者的腰上固定一手机,手机以50Hz的采样频率采集内嵌加速度计和陀螺仪的数据,志愿者被要求做以下六个动作:walking(行走),walking upstairs(爬楼梯),walking downstairs(下楼梯),sitting(坐着),standing(站着),laying(躺下)。在滤除噪声之后,通过滑动窗口的方式将信号切分成2.56s的窗口,每个窗口包含128个样本。
该数据集包含三组数据three-axial linear body acceleration(去除重力加速度的加速度计数据)、three-axial linear total acceleration(包含重力加速度的加速度计数据)、three-axial angular velocity(陀螺仪的数据),因此共有九个分量,其中训练集有7392个窗口,测试集有2947个窗口。
图3 数据集分布
1 数据可视化
图4 一个例子的展示
2 特征提取
def get_first_n_peaks(x, y, no_peaks=5):
y_ = list(x), list(y)
if len(x_) >= no_peaks:
return x_[:no_peaks], y_[:no_peaks]
else:#少于5个peaks,以0填充
missing_no_peaks = no_peaks-len(x_)
return x_ + [0]*missing_no_peaks, y_ + [0]*missing_no_peaks
def get_features(x_values, y_values, mph):
indices_peaks = detect_peaks(y_values, mph=mph)
peaks_y = get_first_n_peaks(
y_values[indices_peaks])
return peaks_x + peaks_y
def extract_features_labels(dataset, labels, N, f_s, denominator):
percentile = 5
list_of_features = []
list_of_labels = []
for signal_no in range(0, len(dataset)):
features = []
list_of_labels.append(labels[signal_no])
for signal_comp in range(0, dataset.shape[2]):
signal = dataset[signal_no, :, signal_comp]
signal_min = np.nanpercentile(signal, percentile)
signal_max = np.nanpercentile(signal, 100-percentile)
#ijk = (100 - 2*percentile)/10
#set minimum peak height
mph = signal_min + (signal_max - signal_min)/denominator
features += get_features(*get_psd_values(signal, N, f_s), mph)
features += get_features(*get_fft_values(signal, N, f_s), mph)
features += get_features(*get_autocorr_values(signal, N, f_s), mph)
list_of_features.append(features)
return np.array(list_of_features), np.array(list_of_labels)
Y_train = extract_features_labels(train_signals, train_labels, N, f_s, denominator)
Y_test = extract_features_labels(test_signals, test_labels, N, f_s, denominator)
图5 特征提取详细介绍
03 模型训练及结果展示
当构建完特征矩阵以及其对应的标签之后,我们可以选择scikit-learn库中的相关模型进行训练。
clf = RandomForestClassifier(n_estimators=1000)
clf.fit(X_train, Y_train)
print("Accuracy on training set is : {}".format(clf.score(X_train, Y_train)))
print("Accuracy on test set is : {}".format(clf.score(X_test, Y_test)))
Y_test_pred = clf.predict(X_test)
print(classification_report(Y_test, Y_test_pred))
结果如下:
图6 分类结果展示
图7 模型比较
04 参考文献
1、http://ataspinar.com/2018/04/04/machine-learning-with-signal-processing-techniques/
2、https://archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones
https://momodel.cn/workspace/5ea79ad6d6fc39472d053640/app
关于我们
Mo 人工智能俱乐部 是由人工智能在线建模平台(网址:https://momodel.cn)的研发与产品团队发起、致力于降低人工智能开发与使用门槛的俱乐部。团队具备大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。
目前团队每周在杭州举办线下沙龙,进行机器学习相关论文分享与学术交流。希望能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推动人工智能民主化、应用普及化。
添加管理员微信加入 Mo-AI 俱乐部群聊
Mo(网址:https://momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。
发现意外,创造可能
Mo
以上是关于python玩转信号处理与机器学习入门的主要内容,如果未能解决你的问题,请参考以下文章
14张Python代码速查表,玩转数据分析&可视化&机器学习