近似熵(Approximate Entropy)

  • 统计学中,近似熵ApEn是一种用于量化时间序列数据波动的规律性和不可预测性1的非线性分析技术。最初,规律性是通过精确的规律性统计来衡量的,其要集中在利用各种熵进行测量。然而,精确的熵计算需要大量的数据,并且结果会受到系统噪声的极大影响,因此将这些方法应用于实验数据是不切实际的。ApEn由Steve M. Pincus开发,通过修改精确的正则性统计量Kolmogorov-Sinai熵来处理这些限制。ApEn最初是为了分析医疗数据而开发的2,例如心率1,后来将其应用于金融3,生理学4和气候科学5
  • 优点:
    • 只要比较短的数据就能得出比较稳健的估计值 , 所需数据点数大致是10-5000点, 一般是1000点左右;
    • 采用短数据估计特征量的可以随着时间过程的发展, 采用滑动窗来估计特征参数随时间的变化。这种动态信息往往是实际工作中更需要的。
    • 较好的抗噪和抗干扰能力。特别是对偶尔产生的瞬态强干扰有较好的承受能力;
    • 无论信号是随机的或确定性的都可以使用,因此也可以用于随机成分和确定性;

算法

  1. 定义一个包含 N N N个数据点时间序列: u ( 1 ) , u ( 2 ) , … , u ( N ) u(1),u(2),\dots,u(N) u(1),u(2),,u(N)
  2. 设定一个 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(Nm+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+m1)},i=1Nm+1
  3. 定义 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=0m1[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=1Nm+1间的距离
  4. 给定指定阈值 r r r对每一个 i i i值统计距离 d d d小于 r r r的数目及此数目与距离总数 N − m N-m Nm的比值,记为 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)=Nm1{d[x(i),x(j)]<r}
  5. 现将 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)=Nm+11i=1Nm+1lnCim(r)
  6. 再讲维数加 1 1 1,变为 m + 1 m+1 m+1,重复步骤 2 → 5 2\to5 25,得到 C i m + 1 ( r ) C_{i}^{m+1}(r) Cim+1(r) ϕ m + 1 ( r ) \phi^{m+1}(r) ϕm+1(r)
  7. 理论上该序列的近似熵为: 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.10.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]))

  1. Evaluation of Eye Metrics as a Detector of Fatigue ↩︎ ↩︎

  2. 近似熵: 一种适用于短数据的复杂性度量 ↩︎

  3. Irregularity, volatility, risk, and financial market time series ↩︎

  4. Physiological time-series analysis: what does regularity quantify? ↩︎

  5. Analyzing changes in the complexity of climate in the last four decades using MERRA-2 radiation data ↩︎

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐