近似熵原理(Approximate Entropy)与Python实现
近似熵(Approximate entropy)的计算原理与Python实现代码
·
近似熵(Approximate Entropy)
- 统计学中,近似熵
ApEn
是一种用于量化时间序列数据波动的规律性和不可预测性1的非线性分析技术。最初,规律性是通过精确的规律性统计来衡量的,其要集中在利用各种熵进行测量。然而,精确的熵计算需要大量的数据,并且结果会受到系统噪声的极大影响,因此将这些方法应用于实验数据是不切实际的。ApEn
由Steve M. Pincus开发,通过修改精确的正则性统计量Kolmogorov-Sinai熵来处理这些限制。ApEn
最初是为了分析医疗数据而开发的2,例如心率1,后来将其应用于金融3,生理学4和气候科学5。 - 优点:
- 只要比较短的数据就能得出比较稳健的估计值 , 所需数据点数大致是10-5000点, 一般是1000点左右;
- 采用短数据估计特征量的可以随着时间过程的发展, 采用滑动窗来估计特征参数随时间的变化。这种动态信息往往是实际工作中更需要的。
- 较好的抗噪和抗干扰能力。特别是对偶尔产生的瞬态强干扰有较好的承受能力;
- 无论信号是随机的或确定性的都可以使用,因此也可以用于随机成分和确定性;
算法
- 定义一个包含 N N N个数据点时间序列: u ( 1 ) , u ( 2 ) , … , u ( N ) u(1),u(2),\dots,u(N) u(1),u(2),…,u(N)
- 设定一个 m m m表示窗口的长度,生成一组维数为 m m m的向量: x ( 1 ) , x ( 2 ) , … , x ( N − m + 1 ) \mathbf{x}(1),\mathbf{x}(2),\dots,\mathbf{x}(N-m+1) x(1),x(2),…,x(N−m+1), 其中: x ( i ) = { u i , u ( i + 1 ) , … , u ( i + m − 1 ) } , i = 1 → N − m + 1 \mathbf{x}(i)=\left\{u{i},u(i+1),\dots,u(i+m-1)\right\},i=1\to N-m+1 x(i)={ui,u(i+1),…,u(i+m−1)},i=1→N−m+1
- 定义 x ( i ) \mathbf{x}(i) x(i)和 x ( j ) \mathbf{x}(j) x(j)的距离 d [ x ( i ) , x ( j ) ] d[\mathbf{x}(i),\mathbf{x}(j)] d[x(i),x(j)]为两者对应元素中差值最大的一个,即: d [ x ( i ) , x ( j ) ] = m a x k = 0 → m − 1 [ ∣ x ( i + k ) − x ( j + k ) ∣ ] d[\mathbf{x}(i),\mathbf{x}(j)]=max_{k=0\to m-1}[\left |x(i+k)-x(j+k) \right | ] d[x(i),x(j)]=maxk=0→m−1[∣x(i+k)−x(j+k)∣], 并对每一个 i i i值计算 x ( i ) x(i) x(i)与其余矢量 x ( j ) , j = 1 → N − m + 1 x(j),j=1\to N-m+1 x(j),j=1→N−m+1间的距离
- 给定指定阈值 r r r对每一个 i i i值统计距离 d d d小于 r r r的数目及此数目与距离总数 N − m N-m N−m的比值,记为 C i m ( r ) C_{i}^{m}(r) Cim(r)即: C i m ( r ) = 1 N − m { d [ x ( i ) , x ( j ) ] < r } C_{i}^{m}(r)=\frac{1}{N-m}\left\{d[\mathbf{x}(i),\mathbf{x}(j)]<r\right\} Cim(r)=N−m1{d[x(i),x(j)]<r}
- 现将 C i m ( r ) C_{i}^{m}(r) Cim(r)取对数,再求其对所有 i i i的平均值,记作: ϕ m ( r ) = 1 N − m + 1 ∑ i = 1 N − m + 1 l n C i m ( r ) \phi^{m}(r)=\frac{1}{N-m+1}\sum^{N-m+1}_{i=1}lnC_{i}^{m}(r) ϕm(r)=N−m+11i=1∑N−m+1lnCim(r)
- 再讲维数加 1 1 1,变为 m + 1 m+1 m+1,重复步骤 2 → 5 2\to5 2→5,得到 C i m + 1 ( r ) C_{i}^{m+1}(r) Cim+1(r)和 ϕ m + 1 ( r ) \phi^{m+1}(r) ϕm+1(r)
- 理论上该序列的近似熵为: A p E n ( m , r ) = l i m N → ∞ [ ϕ m ( r ) − ϕ m + 1 ( r ) ] ApEn(m,r)=lim_{N\to \infty}[\phi^{m}(r)-\phi^{m+1}(r)] ApEn(m,r)=limN→∞[ϕm(r)−ϕm+1(r)]
- 一般而言,此极限值以概率1存在,实际工作时 N N N不可能为 ∞ \infty ∞。当 N N N为有限值时按上述步骤得到的是序列长度为 N N N时的 A p E n ApEn ApEn估计值。记为: A p E n ( m , r , N ) = ϕ m ( r ) − ϕ m + 1 ( r ) ApEn(m,r,N)=\phi^{m}(r)-\phi^{m+1}(r) ApEn(m,r,N)=ϕm(r)−ϕm+1(r)
- 根据实践,建议 m = 2 , r = 0.1 ∼ 0.25 S D u m=2,r=0.1\sim 0.25SD_{u} m=2,r=0.1∼0.25SDu, S D u SD_{u} SDu为原始数据 u u u的标准差
Python实现
import numpy as np
def ApEn(time_series, m=2, r=0.15):
"""
Approximate Entropy
Parameters
----------
time_series: {array-like}, 1D data
m: int, Embedding dmension
r: float, Radius distance threshold
Return
----------
The approximate entropy estimates of the data sequence
"""
time_series = np.squeeze(time_series)
def max_dist(x_i, x_j):
return max([abs(ia - ja) for ia, ja in zip(x_i, x_j)])
def phi(m):
x = [[time_series[j] for j in range(i, i + m - 1 + 1)]
for i in range(N - m + 1)]
C = [
len([1 for x_j in x if max_dist(x_i, x_j) <= r]) / (N - m + 1.0)
for x_i in x
]
return (N - m + 1.0)**(-1) * sum(np.log(C))
N = len(time_series)
return phi(m) - phi(m + 1)
第三方库
import EntropyHub as EH
Ap, Phi = EH.ApEn(time_series,m=2,r=0.15)
print('m=2, ApEn={}'.format(Ap[-1]))
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)