近似熵(Approximate Entropy)
- 统计学中,近似熵
ApEn
是一种用于量化时间序列数据波动的规律性和不可预测性的非线性分析技术。最初,规律性是通过精确的规律性统计来衡量的,其要集中在利用各种熵进行测量。然而,精确的熵计算需要大量的数据,并且结果会受到系统噪声的极大影响,因此将这些方法应用于实验数据是不切实际的。ApEn
由Steve M. Pincus开发,通过修改精确的正则性统计量Kolmogorov-Sinai熵来处理这些限制。ApEn
最初是为了分析医疗数据而开发的,例如心率,后来将其应用于金融,生理学和气候科学。 - 优点:
- 只要比较短的数据就能得出比较稳健的估计值 , 所需数据点数大致是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
,
j
≠
i
x(j),j=1\to N-m+1,j\ne i
x(j),j=1→N−m+1,j=i间的距离
- 给定指定阈值
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实现
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
"""
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)