当前位置: 首页 > 后端技术 > Python

python信号处理和机器学习入门

时间:2023-03-25 21:03:55 Python

python信号处理和机器学习入门迷茫,不知道从何入手。别慌,接下来小编就带大家了解一下如何用python来处理这些看似无用但实际上蕴含着巨大信息量的随机信号。我们日常生活中看到的心电图、声波图等都是信号在时域的表征,而无法呈现信号在频域的信息。因此,本文将主要介绍信号从时域到频域的一些变换。常见的有FFT(快速傅立叶变换)、PSD(功率谱密度)、auto-correlation(自相关分析)。最后,小编带大家通过一个例子,通过手机采集的振动信号识别人体动作。1.简介这部分将介绍FFT、PSD、自相关的基本概念和python代码实现。1.1混合信号图1时域中的信号表示图2频域中的信号表示上图显示了混合信号在时域中的表示。图(a)为频率为1Hz、幅值为2Wave的正弦波信号,图(b)为频率为5Hz、幅值为1的正弦波信号,图(c)为叠加结果两个信号(a)和(b)。1.2FFTFFT的英文全称是FastFourierTransformation,即快速傅立叶变换,可以很方便地分析混合信号中的频率成分。对上述混合信号进行FFT变换,结果如图2(a)所示,可以清楚地看出混合信号中分别含有频率为1Hz和5Hz的分量。FFT变换的代码如下:fromscipy.fftpackimportfftdefget_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])returnf_values,fft_values1.3PSDPSD的英文全称是PowerSpectralDensity,即功率谱密度。和FFT一样,它反映了信号在频域的信息。PSD频谱图脉冲下方的区域表示该频率下信号的能量分布。对上述混合信号进行PSD变换,结果如图2(b)所示,可以清楚地看到混合信号在1Hz和5Hz频率下的能量分布。PSD变换的代码如下:fromscipy.signalimportwelchdefget_psd_values(y_values,N,f_s):f_values,psd_values=welch(y_values,fs=f_s)returnf_values,psd_values1.4AutocorrelationAutocorrelation表示自相关,它可以被计算信号的自相关性,即经过一个时间延迟后信号与自身的相似度。对上述混合信号计算自相关,结果如图2(c)所示。有趣的是,自相关和PSD是一对FFT变换。PSD可以通过对Autocorrelation进行FFT变换得到,而Autocorrelation可以通过对PSD进行IFFT(inversefastFouriertransform)得到。defautocorr(x):result=np.correlate(x,x,mode='full')returnresult[len(result)//2:]defget_autocorr_values(y_values,N,f_s):autocorr_values=autocorr(y_values)x_values=np.array([1.0*jj/f_sforjjinrange(0,N)])returnx_values,autocorr_values两个例子经过上面的简单介绍,相信你已经理解并掌握了变换频域中的信号。把它写下来,让我们使用我们刚刚学习的知识结合机器学习知识来分析一个示例HumanActivityRecognitionUsingSmartphonesDataSet。该数据集是通过对30名不同年龄分布的志愿者进行实验收集的。一部手机固定在志愿者的腰间。手机以50Hz的采样频率采集内置加速度计和陀螺仪的数据。志愿者被要求做以下六个动作:步行(walking)、步行上楼(climbingthestairs)、步行下楼(downthestairs)、坐着(sitting)、站着(standing)、躺着(lyingdown)。滤除噪声后,通过滑动窗口将信号分成2.56s的窗口,每个窗口包含128个样本。数据集包含三组数据:三轴线性体加速度(加速度计数据不含重力加速度)、三轴线性总加速度(加速度计数据包括重力加速度)、三轴角速度(陀螺仪数据),所以有共九个分量,其中训练集有7392个窗口,测试集有2947个窗口。图3数据集分布2.1数据可视化随机选取一个信号,绘制其时域和频域波形如下图,绘制代码详见项目链接:图4示例展示2.2特征提取完成Spectrum改造后,我们需要从中提取特征,以便应用我们熟悉的机器学习模型,如随机森林、逻辑回归、支持向量机等。那么提取了哪些特征呢?一种方法是提取脉冲(峰值)出现的水平和垂直坐标。我们提取频谱中前5个脉冲的水平和垂直坐标作为特征。可以使用detect_peaks提取峰值信息。defget_first_n_peaks(x,y,no_peaks=5):x_,y_=list(x),list(y)iflen(x_)>=no_peaks:returnx_[:no_peaks],y_[:no_peaks]else:#少大于5个peaks,以0填充missing_no_peaks=no_peaks-len(x_)returnx_+[0]*missing_no_peaks,y_+[0]*missing_no_peaksdefget_features(x_values,y_values,mph):indices_peaks=detect_peaks(y_values,mph=mph)peaks_x,peaks_y=get_first_n_peaks(x_values[indices_peaks],y_values[indices_peaks])返回peaks_x+peaks_ydefextract_features_labels(dataset,labels,N,f_s,denominator):percentile=5list_of_features=[]list_of_labels=[]forsignal_noinrange(0,len(dataset)):features=[]list_of_labels.append(labels[signal_no])forsignal_compinrange(0,dataset.shape[2]):signal=dataset[signal_no,:,signal_comp]signal_min=np.nanpercentile(信号,百分位数)signal_max=np.nanpercentile(信号,100-percentile)#ijk=(100-2*percentile)/10#set最小峰高mph=signal_min+(signal_max-signal_min)/denominatorfeatures+=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)返回np.array(list_of_features),np.array(list_of_labels)X_train,Y_train=extract_features_labels(train_signals,train_labels,N,f_s,denominator)X_test,Y_test=extract_features_labels(test_signals,test_labels,N,f_s,denominator)图5特征提取细节2.3模型训练及结果展示特征矩阵后及其对应的标签,我们可以选择scikit-learn库中的相关模型进行训练clf=RandomForestClassifier(n_estimators=1000)clf.fit(X_train,Y_train)print("训练集的准确度是:{}".format(clf.score(X_train,Y_train)))print("测试集的准确度是:{}".format(clf.score(X_test,Y_test)))Y_test_pred=clf.predict(X_test)print(classification_report(Y_test,Y_test_pred))结果如下。图6分类结果展示图7模型对比结果表明,我们能够以相当高的准确率(89%)对这些信号进行分类,而且我们甚至没有做任何人工特征工程来实现这个结果,所有的特征都是自动获得。对于每个变换,我们取前五个峰的水平和垂直坐标(如果少于五个,则用0填充)。可以理解的是,这270个特征中的某些特征会提供比其他特征更多的信息。如果能主动选择对分类重要的特征进行组合,或者优化超参数,相信准确率还是很高的。可以继续改进。项目地址:https://momodel.cn/workspace/5ea79ad6d6fc39472d053640/app参考资料:http://ataspinar.com/2018/04/04/machine-learning-with-signal-processing-techniques/https://archive。ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones关于我们Mo(网址:https://momodel.cn)是一个支持Python的在线人工智能建模平台,可以帮助您快速开发、训练和部署模型。近期,莫老师也在持续分享机器学习相关的入门课程和论文。欢迎关注我们的公众号获取最新资讯!