【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第一篇)——近似熵及其MATLAB实现
在特征提取領域,近似熵、樣本熵、排列熵和模糊熵是比較經常出現的概念。
首先一句話總結一下:這幾個熵值都是用來表征信號序列復雜程度的無量綱指標,熵值越大代表信號復雜度越大。信號復雜程度的表征在機械設備狀態監測、故障診斷以及心率、血壓信號檢測中都十分有用;能夠抵抗環境干擾的影響,廣泛應用于特征提取的領域當中。
從本篇開始,將依次介紹上述幾個熵特征的概念和靠譜的MATLAB代碼實現。
今天從近似熵開始。
一、近似熵
近似熵(Approximate Entropy,ApEn)概念最早是由 Steven M. Pincus 于 1991年從衡量信號序列復雜性的角度提出的[1],用于度量信號中產生新模式概率的大小,越復雜的時間序列對應的近似熵越大,越規則的時間序列對應的近似熵則越小。
近似熵的計算也可理解為求取一個時間序列在模式上的自相似程度。對于一個信號序列的變化,可以利用近似熵值的改變達到有效識別的目的。近似熵的計算最大的優點是不需要很長的數據量,多數實測的時間序列都能夠滿足要求,得到的結果穩健可靠[2]。1.1 近似熵的含義[2]
下面相對形象但不那么嚴謹地解釋一下近似熵的含義。
假設待分析信號序列為x(1),x(2),...,x(N)。
(1)【序列定義】給定模式維數m,可以構造出一組m維矢量:
其中i=1~N-m+1,通常m取2,當m取2的時候:
近似熵的物理本質
(2)【近似的含義】上圖中的折線是待分析信號(m取2),X(i)和X(j)是圖中實線部分。
X(i)的端點處設置一個相似容限閾值r,圖中A、B區間分別表示x(i)和x(i+1)的容限范圍,如果X(j)的對應端點都在容限范圍內,則認為2維特征向量X(i)和X(j)的模式在r下近似。
在確定的i值下,遍歷所有的X(i)和X(j)的組合(包括i與j相等的情況,總共會有N-m+1種),記錄出近似的數量。
(3)【近似比例】將近似數量與總數量的比值記為?
?(4)此時再求得:
(5)將維數加1變為m+1,重復以上步驟,得到?
?(6)【近似熵】求得信號序列的近似熵為:
上式中m通常取2,r通常取(0.1~0.25)SD(x),其中SD(x)代表信號序列的標準差。
1.2 近似熵的特點
結合近似熵的數學定義可見,近似熵的物理本質就是衡量當維數變化時信號序列中新模式出現的對數條件概率均值,因此理論上近似熵在表征信號序列的不規則性和復雜性方面具有較大的意義。需要指出的是,在實際應用中,我們更關注的是各信號近似熵值的相對大小。① 近似熵具有較好的抗噪及抗干擾的能力。因為產生這類干擾的數據點所具有的獨特性,使得這些數據點與相鄰點所構成的線段與x(i)的距離較遠,容限閾值r 使得這些干擾點得到有效去除。
② 近似熵的分析效果比均差、方差、標準差等統計算法更加有效,因為近似熵保留了原始信號序列中的時間序列信息,反映了信號序列在結構分布上的特性。這一特性使得近似熵測度能夠更加準確有效地提取出故障信號中的特征信息。
③ 近似熵只需要較少的數據點,就可達到對信號序列從統計性角度描述的目的。
④ 近似熵分析具有較強的通用能力,可用于隨機信號、確定性信號以及兩者的混合所組成的信號。
1.3 近似熵的參數選擇
近似熵在計算之前我們需要對影響近似熵值大小的3個參數m?、r?、N?來進行確定。
1) m的選擇。m可以被稱之為模式維數,它是用來計算近似熵的時序列的窗口長度。在一般情況下,選擇m=2會優于m=1,因為在序列的聯合概率在動態重構時候,就會有更多的信息。我們一般不會選擇m>2 ,因為在m>2 時,N就應該在數千個點之上,然而我們一般不會讓N大于5000,因為當N大于5000時,就不能確保事物的狀態有相同的性質;相反,在N選定之后,在m>2的情況下,同時我們還想獲得比較理想的結果下,r就必須較大,在分析想要得到的序列的分布就會不得不失去很多信息。因此,我們通常選擇m=2?。
2) r的選擇。r即相似容限閾值。當r的值較大時,會丟失較多的信息,而當r的值較小時,又會不能理想的估計出系統的統計特性。在經過Pincus等人的不懈努力,總結得到當r?在0.1和0.25SD(x)(SD(x)是序列的標準差)之間, ApEn有比較合理的統計特性。
3) N的選擇。Pincus等人通過大量的實驗表明,對于給定的數據,一般輸入點數要控制在100到5000這個范圍內才能保證會有有效的統計特性以及較小的誤差。
1.4 近似熵算法的局限性
第一點。簡單地說,上邊第(2)步中求X(i)和X(j)的近似時,是將自身數據段也算在其中了,比如X(1)和X(1)之間必然是相似的,而這一個相似也被計入到近似的總數量當中了,這樣做是為了避免等于0的情況,而ln0顯然是沒有意義的。但是,將自身數據段引入到計算當中又不可避免地會帶來計算偏差。
?第二點。上邊講到了,當數據長度N在100-5000的范圍內近似熵才可以得到有效的計算結果,也就是說計算樣本熵值收到數據長度制約,這也限制了該算法的使用范圍。
因此其后研究者們又提出了不同的改進方法,這就是后邊的文章要講的了。
2.MATLAB代碼實現
近似熵的代碼有兩個源頭,一個是matlab2018a以上版本內置了approximateEntropy函數;另外一個是網上流傳的ApproximateEntropy.m函數文件。這兩個代碼筆者做了對比和測試,運行結果是相同的。
在此筆者采用了后者,因為這個函數實現并不是十分復雜,我在這個代碼上逐行添加了注釋,并與上述文章中的算法步驟做了對照講解。我將其命名為kApproximateEntropy,如下:
為了特征提取代碼的易用性,筆者對一系列熵特征提取進行了封裝,包括上邊添加注釋的代碼都集中到一起。由于搞科研寫論文時,對特征提取的需要往往是集中性的、多種類的、需求各異的,所以我把之前介紹過的熵特征值和后邊將會降到的集中熵特征進行了打包:
熵特征值共7個——功率譜熵、奇異譜熵、能量熵、近似熵、樣本熵、排列熵、模糊熵以上7種全都集中到一個封裝函數里,實現一行代碼完成特征提取。
比如提取數據“近似熵”就可以像這樣寫:
fea = genFeatureEn(data,{'ApEn'}) %對data求近似熵如果提取數據“功率譜熵、奇異譜熵、能量熵、近似熵、樣本熵、排列熵、模糊熵”這全部7種特征,就可以這樣寫:
fea =genFeatureEn(data,{'psdE','svdpE','eE', 'ApEn', 'SpEn','PeEn','FuzzyEn'}); %調用genFeature函數,完成特征提取,算出的特征值會保存在fea變量里也就是說需要提取哪個特征,在函數中直接指定就可以了。輸出的fea變量里就會得到相應的這些特征值,順序也是與輸入的排序保持一致的。
這個函數的介紹如下:
function fea = genFeatureEn(data,featureNamesCell,options) % 熵相關算法的信號特征提取函數 % 輸入: % data:待特征提取的時域信號,可以是二維數據,維度為m*n,其中m為數據組數,n為每組數據的長度。即每行數據為一組。行列方向不可出錯 % options:其他設置,使用結構體的方式導入。目前可設置變量包括: % -svdpEn:即奇異值的窗口長度。 % -Apdim:近似熵參數,Apdim為近似熵的模式維度 % -Apr:近似熵參數,Apr為近似熵的閾值 % -Spdim:樣本熵參數,Spdim為樣本熵的模式維度 % -Spr:Spr為樣本熵的閾值 % -Fuzdim:模糊熵參數,Fuzdim為模糊熵模式維度 % -Fuzr:模糊熵參數,Fuzr為模糊熵的閾值 % -Fuzn:模糊熵參數,Fuzn為模糊熵權重 % -Pedim:排列熵參數,Pedim為排列熵模式維度 % -Pet:排列熵參數,Pet為排列熵的時間延遲 % featureNamesCell:擬進行特征提取的特征名稱,該變量為cell類型,其中包含的特征名稱為字符串,特征名稱需要在下邊列表中: % 目前支持的特征(2022.5.23,共7種): % psdE:功率譜熵 % svdpE:奇異譜熵 % eE:能量熵 % ApEn:近似熵 % SampleEn:樣本熵 % FuzzyEn:模糊熵 % PerEn:排列熵 % % 輸出: % fea:數據data的特征值數組,其特征值順序與featureNamesCell一一對應 %需要上邊這個函數文件以及測試代碼的同學,可以在下面鏈接獲取:
特征提取(熵特征指標) | 工具箱文檔
3.其他:時域、頻域特征提取的MATLAB代碼實現
除了上述熵特征的提取,筆者還對之前文章中講到過的時域和頻域特征進行了代碼實現,具體包括:
有量綱特征值8個——最大值、最小值、峰峰值、均值、方差、標準差、均方值、均方根值(RMS)無量綱特征值6個——峭度、偏度、波形因子、峰值因子、脈沖因子、裕度因子
頻域特征值5個——重心頻率、均方頻率、均方根頻率、頻率方差、頻率標準差
譜峭度特征4個——譜峭度的均值、譜峭度的標準差、譜峭度的偏度、譜峭度的峭度
以上23種全都集中到一個封裝函數里,實現一行代碼完成特征提取。
比如提取數據“重心頻率”就可以像這樣寫:
fea = genFeatureTF(data,{'FC'}) %對data數據求重心頻率如果提取數據“最大值、最小值、峰峰值、均值、方差、標準差、均方值...”這全部22種特征,就可以這樣寫:
fea =genFeatureTF(data,{'max','min','mean','peak','arv','var','std','kurtosis',...'skewness','rms','waveformF','peakF','impulseF','clearanceF',...'FC','MSF','RMSF','VF','RVF',...'SKMean','SKStd','SKSkewness','SKKurtosis'}); %調用genFeature函數,完成特征提取,算出的特征值會保存在fea變量里也就是說需要提取哪個特征,在函數中直接指定就可以了。輸出的fea變量里就會得到相應的這些特征值,順序也是與輸入的排序保持一致的。
這個函數的介紹如下:
function fea = genFeatureTF(data,fs,featureNamesCell) % 時域、頻域相關算法的信號特征提取函數 % 輸入: % data:待特征提取的時域信號,可以是二維數據,維度為m*n,其中m為數據組數,n為每組數據的長度。即每行數據為一組。行列方向不可出錯 % fs:采樣頻率,如果不提取頻域特征,fs值可以設置為1 % featureNamesCell:擬進行特征提取的特征名稱,該變量為cell類型,其中包含的特征名稱為字符串,特征名稱需要在下邊列表中: % 目前支持的特征(2022.5.23,共23種): % max :最大值 % min :最小值 % mean :平均值 % peak :峰峰值 % arv :整流平均值 % var :方差 % std :標準差 % kurtosis :峭度 % skewness :偏度 % rms :均方根 % waveformF :波形因子 % peakF :峰值因子 % impulseF :脈沖因子 % clearanceF:裕度因子 % FC:重心頻率 % MSF:均方頻率 % RMSF:均方根頻率 % VF:頻率方差 % RVF:頻率標準差 % SKMean:譜峭度的均值 % SKStd:譜峭度的標準差 % SKSkewness:譜峭度的偏度 % SKKurtosis:譜峭度的峭度 % % 輸出: % fea:數據data的特征值數組,其特征值順序與featureNamesCell一一對應需要上邊這個函數文件以及測試代碼的同學,可以在下邊鏈接中獲取:
特征提取(時域、頻域指標) | 工具箱文檔
上述2個函數(熵特征提取函數“genFeatureEn”和時頻特征提取函數“genFeatureTF”)會持續更新,有哪些想要加進去的特征指標,同學們可以在評論區留言,筆者會考慮納入到這個“特征提取指標全家桶”中。
參考
總結
以上是生活随笔為你收集整理的【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第一篇)——近似熵及其MATLAB实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java实现微信小程序支付(支付,提现,
- 下一篇: 杀毒软件评测