熵,事物的混亂程度;
熵有很多種計算方式;
概念介紹
如何理解呢?或者說 兩個 均值相減 怎么就能反應 時間序列 的復雜性?
首先,簡單思考下這個計算過程,先用 m 長的窗口 滑動生成 一組 m 長的數組,假設 m = 2,那就是 一個 (n-m+1)x2 的數組,然后計算 每行 之間的距離,這其實就是 計算 原時間序列 中 相鄰元素的距離,或者說 相關性,然后 看看 所有 相鄰元素的相關性 如何(均值);
接着,把 每 相鄰 元素 變成 每 3 個元素,變成 (n-m+1)x3 的數組,然后 再 計算 相關性;
如果 原時間序列 很平穩,我們可以想象成 恆等於 某個值,那么相鄰 2 個相關性很大,相鄰 3 個相關性還是很大,也就是說 窗口變長 並沒有 降低相關性;
反之,如果原時間序列 沒那么平穩,只存在短期相關,那么 相鄰 2 個 相關性較大,相鄰 3 個 相關性 會大大降低,此時 兩個 相關性 相減 差就會比較大,這就得到了 近似熵; 【此次的平穩是我們通俗說的平穩】
所以,近似熵 越大,時間序列 越 不平穩,或者說 越 復雜;
從原理上看,三者都是評價 波形 前后的混亂程度的,也就是 評價 波形 重復性的,也就是 頻率,熵越大,包含的不同頻率越多,越混亂;
三個之間的區別的話
近似熵,1991年的算法。
樣本熵,2000年的算法。近似熵在比較的時候有一個自身比較的數值在里面,這個算法優化了。
模糊熵,2007年的算法。前面兩個算法在評價時加入了一個閾值:大於閾值就混亂,小於就不混亂。模糊熵加入了一個fuzzy的思想在里面。更科學一些。
啥叫fuzzy,就比如說,原來分男女,只有 是 或者 不是 這種。現在加入了模糊思想,就告訴你,這貨有0.8的概率是男的,有0.2的概率是女的這種。這種軟分類其實更科學的。更多的可以參考fuzzy c means算法。
與近似熵相比,樣本熵具有兩個優勢:樣本熵的計算不依賴數據長度;樣本熵具有更好的一致性,即參數m和r的變化對樣本熵的影響程度是相同的。
目前樣本熵在評估生理時間序列(EEG,sEMG等)的復雜性和診斷病理狀態等方面均有應用。
Python 樣本熵
pip install sampen
參數解釋
def sampen2(data, mm=2, r=0.2, normalize=False)
data:一維信號
mm:窗口長度,一般 選擇 2,偶爾選擇 3,一般不選其他值
r:在很大程度上取決於實際應用場景,通常選擇 r=0.2∗stdr,其中 std 表示原時間序列的標准差
示例
from sampen import sampen2 # initialize a list(初始化list) series_data = [] # open the file and read each line into the list(按行讀取) with open('relative/path/to/file.txt', 'r') as file: for row in file: series_data.append(float(row.strip(' \t\n\r'))) # calculate the sample entropy sampen_of_series = sampen2(series_data)
輸出
[ (0, 2.140629540027156, 0.0028357991885715863) (1, 2.162868347337613, 0.004903248034526253), ( # Epoch length for max epoch(最大長度) 2, # SampEn(樣本熵的值) 2.123328492035711, # Standard Deviation(標准偏差) 0.007596323621379352 ), ]
參考資料:
https://www.zhihu.com/question/266285555/answer/1151247378 知乎
https://sampen.readthedocs.io/en/stable/ 官網代碼
https://blog.csdn.net/Fanhe_ecust/article/details/101778803 樣本熵的python代碼實現
https://blog.csdn.net/cratial/article/details/79707169
https://blog.csdn.net/u011389706/article/details/80984209 信號處理算法(2):樣本熵(SampEn) 有原理