近似熵原理与Python实现(Approximate Entropy)
    近似熵(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)