近似熵(ApEn)是一种用于量化时间序列数据波动规律性和不可预测性的非线性分析技术,尤其适用于短数据集。它由Steve M. Pincus开发,常用于医学、金融、生理学和气候科学等领域。ApEn计算涉及嵌入维数、距离阈值等参数,能较好地抵抗噪声和干扰,且对随机和确定性信号都适用。Python中可以通过EntropyHub库实现ApEn的计算。
统计学中,近似熵ApEn是一种用于量化时间序列数据波动的规律性和不可预测性1的非线性分析技术。最初,规律性是通过精确的规律性统计来衡量的,其要集中在利用各种熵进行测量。然而,精确的熵计算需要大量的数据,并且结果会受到系统噪声的极大影响,因此将这些方法应用于实验数据是不切实际的。ApEn由Steve M. Pincus开发,通过修改精确的正则性统计量Kolmogorov-Sinai熵来处理这些限制。ApEn最初是为了分析医疗数据而开发的2,例如心率1,后来将其应用于金融3,生理学4和气候科学5。
定义一个包含
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
defApEn(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)defmax_dist(x_i, x_j):returnmax([abs(ia - ja)for ia, ja inzip(x_i, x_j)])defphi(m):
x =[[time_series[j]for j inrange(i, i + m -1+1)]for i inrange(N - m +1)]
C =[len([1for 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]))