理论基础
近似熵?
定义:近似熵是一个随机复杂度,反应序列相邻的m个点所连成折线段的模式的互相近似的概率与由m+1个点所连成的折线段的模式相互近似的概率之差。
作用:用来描述复杂系统的不规则性,越是不规则的时间序列对应的近似熵越大。反应维数改变时产生的新的模式的可能性的大小。
对于eeg信号来说,由于噪声存在、和信号的微弱性、多重信号源叠加,反映出来的是混沌属性,但是同一个人在大脑活动相对平稳的情况下,其eeg近似熵应该变化不大。
- 证明和对应几何意义可参考论文:https://wenku.baidu.com/view/4ec89e44b307e87101f696ef.html
互近似熵
- 从近似熵定义引申出来的,近似熵描述的是一段序列的自相似程度,互近似熵比较的是两段序列的复杂度接近程度;熵值越大越不相似,越小越相似;
近似熵算法分析
设存在一个以等时间间隔采样获得的m维的时间序列u(1),u(2),...,u(N).
定义相关参数维数m,一般取值为2,相似容限即阀值r,其中,维数表示向量的长度;r表示“相似度”的度量值.
重构m维向量X(1),X(2),...,X(N−m+1),其中X(i)=[u(i),u(i+1),...,u(i+m−1)],X(j)=[u(j),u(j+1),...,u(j+m−1)];计算X(i)和X(j)之间的距离,由对应元素的最大差值决定;d[X,X∗]=maxa|u(a)−u∗(a)|d[X,X∗]=maxa|u(a)−u∗(a)|
统计所有的d[X,X∗]<=r的个数g,则g/(N-M)就是本次的i取值对应的相似概率,计算所有i和j取值的概率对数的平均值,即熵值Φm(r);
取m+1重复3、4过程,计算近似熵:
ApEn=Φm(r)−Φm+1(r)
参数选择:通常选择参数m=2或m=3;通常选择r=0.2∗std,其中std表示原时间序列的标准差.
- 互近似熵计算和近似熵的步骤一样,把计算X(i)和X(j)之间的距离改为计算序列a的向量X(i)和序列b的向量Y(j)的距离;相似容限r为两个原序列的0.2倍协方差;
python代码实现
github源码
使用Pincus提出的近似熵定义计算近似熵
class BaseApEn(object):
"""
近似熵基础类
"""
def __init__(self, m, r):
"""
初始化
:param U:一个矩阵列表,for example:
U = np.array([85, 80, 89] * 17)
:param m: 子集的大小,int
:param r: 阀值基数,0.1---0.2
"""
self.m = m
self.r = r
@staticmethod
def _maxdist(x_i, x_j):
"""计算矢量之间的距离"""
return np.max([np.abs(np.array(x_i) - np.array(x_j))])
@staticmethod
def _biaozhuncha(U):
"""
计算标准差的函数
:param U:
:return:
"""
if not isinstance(U, np.ndarray):
U &#