熵,事物的混乱程度;
熵有很多种计算方式;
概念介绍
如何理解呢?或者说 两个 均值相减 怎么就能反应 时间序列 的复杂性?
首先,简单思考下这个计算过程,先用 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) 有原理