近似熵理论相关知识与代码实现

关于本博客的说明: 本次博客主要分享近似熵(Approximate Entropy, AE)的理论相关知识及其代码实现.

一、理论基础

**近似熵(ApEn)**是一种用于量化时间序列波动的规律性和不可预测性的非线性动力学参数,它用一个非负数来表示一个时间序列的复杂性,反映了时间序列中新信息发生的可能性,越复杂的时间序列对应的近似熵越大[1].
算法表述如下:

  1. 设存在一个以等时间间隔采样获得的 N N N维的时间序列 u ( 1 ) , u ( 2 ) , . . . , u ( N ) u(1),u(2),...,u(N) u(1),u(2),...,u(N).

  2. 定义算法相关参数 m m m, r r r,其中, m m m为整数,表示比较向量的长度, r r r为实数,表示“相似度”的度量值.

  3. 重构 m m m维向量 X ( 1 ) , X ( 2 ) , . . . , X ( N − m + 1 ) X(1),X(2),...,X(N-m+1) X(1),X(2),...,X(Nm+1),其中 X ( i ) = [ u ( i ) , u ( i + 1 ) , . . . , u ( i + m − 1 ) ] X(i)=[u(i),u(i+1),...,u(i+m-1)] X(i)=[u(i),u(i+1),...,u(i+m1)].

  4. 对于 1 ≤ i ≤ N − m + 1 1 \leq i \leq N-m+1 1iNm+1,统计满足以下条件的向量个数 C i m ( r ) = ( n u m b e r   o f   X ( j )   s u c h   t h a t   d [ X ( i ) , X ( j ) ] ≤ r ) / ( N − m + 1 ) C_i^m(r)=(number\ of\ X(j)\ such\ that\ d[X(i),X(j)]\le r )/(N-m+1) Cim(r)=(number of X(j) such that d[X(i),X(j)]r)/(Nm+1)
    其中, d [ X , X ∗ ] d[X,X^*] d[X,X]定义为 d [ X , X ∗ ] = max ⁡ a ∣ u ( a ) − u ∗ ( a ) ∣ d[X,{X^*}] = \mathop {\max }\limits_a |u(a) - {u^*}(a)| d[X,X]=amaxu(a)u(a)
    u ( a ) u(a) u(a)为向量 X X X的元素, d d d表示向量 X ( i ) X(i) X(i) X ( j ) X(j) X(j)的距离,由对应元素的最大差值决定, j j j的取值范围为 [ 1 , N − m + 1 ] [1,N-m+1] [1,Nm+1],包括 j = i j=i j=i.

  5. 定义 Φ m ( r ) = ( N − m + 1 ) − 1 ∑ i = 1 N − m + 1 l o g ( C i m ( r ) ) \Phi^m(r)=(N-m+1)^{-1}\sum_{i=1}^{N-m+1}log(C_i^m(r)) Φm(r)=(Nm+1)1i=1Nm+1log(Cim(r)).

  6. 则近似熵(ApEn)定义为 A p E n = Φ m ( r ) − Φ m + 1 ( r ) ApEn=\Phi^m(r)-\Phi^{m+1}(r) ApEn=Φm(r)Φm+1(r)
    l o g log log表示自然对数, m m m r r r由第2步定义.
    参数选择:通常选择参数 m = 2 m=2 m=2 m = 3 m=3 m=3 r r r的选择在很大程度上取决于实际应用场景,通常选择 r = 0.2 ∗ s t d r=0.2*std r=0.2std,其中 s t d std std表示原时间序列的标准差.
    根据相关文献[1],在实际应用中选择 d [ X ( i ) , X ( j ) ] < r d[X(i),X(j)]<r d[X(i),X(j)]<r d [ X ( i ) , X ( j ) ] ≤ r d[X(i),X(j)]\leq r d[X(i),X(j)]r都是可行的.
    如果一个时间序列的规律性比较强,则其近似熵值(ApEn)比较小,对应地,一个比较复杂的时间序列则对应一个较大的熵值.

二、示例

(备注:本示例翻译自Wikipedia关于Approximate entropy的示例[2])

  1. 假设时间序列 S N S_N SN是从心率数据中经过等间隔采样得到的,并且是一个以3为周期的周期时间序列,维度 N = 51 N=51 N=51
    S N = { 85 , 80 , 89 , 85 , 80 , 89 , . . . } S_N=\left \{85,80,89,85,80,89,... \right \} SN={85,80,89,85,80,89,...}
  2. 选择参数: m = 2 m=2 m=2 r = 3 r=3 r=3
  3. 重构 m m m维向量: X ( 1 ) = [ u ( 1 )   u ( 2 ) ] = [ 85   80 ] X(1)=[u(1)\ u(2)]=[85\ 80] X(1)=[u(1) u(2)]=[85 80] X ( 2 ) = [ u ( 2 )   u ( 3 ) ] = [ 80   89 ] X(2)=[u(2)\ u(3)]=[80\ 89] X(2)=[u(2) u(3)]=[80 89] X ( 3 ) = [ u ( 3 )   u ( 4 ) ] = [ 89   85 ] X(3)=[u(3)\ u(4)]=[89\ 85] X(3)=[u(3) u(4)]=[89 85] X ( 4 ) = [ u ( 4 )   u ( 5 ) ] = [ 85   80 ] X(4)=[u(4)\ u(5)]=[85\ 80] X(4)=[u(4) u(5)]=[85 80] . . . . .... ....
  4. 计算向量之间的距离:
    d [ X ( 1 ) , X ( 1 ) ] = max ⁡ a ∣ u ( a ) − u ∗ ( a ) ∣ = 0 < r = 3 d[X(1),X(1)]= \mathop {\max }\limits_a|u(a)-u^*(a)|=0<r=3 d[X(1),X(1)]=amaxu(a)u(a)=0<r=3 d [ X ( 1 ) , X ( 2 ) ] = max ⁡ a ∣ u ( a ) − u ∗ ( a ) ∣ = max ⁡ ∣ u ( 1 ) − u ( 2 ) ∣ , ∣ u ( 2 ) − u ( 3 ) ∣ ) = ∣ u ( 2 ) − u ( 3 ) ∣ = 9 > r = 3 d[X(1),X(2)]= \mathop {\max }\limits_a|u(a)-u^*(a)|= \mathop {\max } |u(1)-u(2)|,|u(2)-u(3)|)=|u(2)-u(3)|=9>r=3 d[X(1),X(2)]=amaxu(a)u(a)=maxu(1)u(2),u(2)u(3))=u(2)u(3)=9>r=3
    类似地可以计算 d [ X ( 1 ) , X ( 3 ) ] = ∣ u ( 2 ) − u ( 4 ) ∣ = 5 > r d[X(1),X(3)]=|u(2)-u(4)|=5>r d[X(1),X(3)]=u(2)u(4)=5>r d [ X ( 1 ) , X ( 4 ) ] = ∣ u ( 1 ) − u ( 4 ) ∣ = ∣ u ( 2 ) − u ( 5 ) ∣ = 0 < r d[X(1),X(4)]=|u(1)-u(4)|=|u(2)-u(5)|=0<r d[X(1),X(4)]=u(1)u(4)=u(2)u(5)=0<r

因此,满足条件 d [ X ( 1 ) , X ( j ) ] ≤ r d[X(1),X(j)]\leq r d[X(1),X(j)]r X ( j ) X(j) X(j)包括 X ( 1 ) , X ( 4 ) , . . . , X ( 49 ) X(1),X(4),...,X(49) X(1),X(4),...,X(49),共17个向量.

此外,因为 1 ≤ i ≤ N − m + 1 1 \leq i \leq N-m+1 1iNm+1,所以满足条件 d [ X ( 3 ) , X ( j ) ] ≤ r d[X(3),X(j)]\leq r d[X(3),X(j)]r X ( j ) X(j) X(j)包括 X ( 3 ) , X ( 6 ) , . . . , X ( 48 ) X(3),X(6),...,X(48) X(3),X(6),...,X(48),共16个向量.

因此有: C 1 2 ( 3 ) = 17 50 C_1^2(3)=\frac{17}{50} C12(3)=5017 C 2 2 ( 3 ) = 17 50 C_2^2(3)=\frac{17}{50} C22(3)=5017 C 3 2 ( 3 ) = 16 50 C_3^2(3)=\frac{16}{50} C32(3)=5016 C 4 2 ( 3 ) = 17 50 C_4^2(3)=\frac{17}{50} C42(3)=5017 . . . . .... ....
5. 计算 Φ 2 ( 3 ) = ( 50 ) − 1 ∑ i = 1 50 l o g ( C i 2 ( 3 ) ) ≈ − 1.0982095403531886 \Phi^2(3)=(50)^{-1}\sum_{i=1}^{50}log(C_i^2(3))\approx -1.0982095403531886 Φ2(3)=(50)1i=150log(Ci2(3))1.0982095403531886.
m = m + 1 = 3 m=m+1=3 m=m+1=3,重复步骤3~4,获得 C 1 3 ( 3 ) = 17 49 C_1^3(3)=\frac{17}{49} C13(3)=4917 C 2 3 ( 3 ) = 16 49 C_2^3(3)=\frac{16}{49} C23(3)=4916 C 3 3 ( 3 ) = 16 49 C_3^3(3)=\frac{16}{49} C33(3)=4916 C 4 3 ( 3 ) = 17 49 C_4^3(3)=\frac{17}{49} C43(3)=4917 . . . . .... ....,因此,有 Φ 3 ( 3 ) = ( 49 ) − 1 ∑ i = 1 49 l o g ( C i 3 ( 3 ) ) ≈ − 1.0981985438120834 \Phi^3(3)=(49)^{-1}\sum_{i=1}^{49}log(C_i^3(3))\approx -1.0981985438120834 Φ3(3)=(49)1i=149log(Ci3(3))1.0981985438120834
6. 计算近似熵(ApEn):
A p E n = Φ 2 ( 3 ) − Φ 3 ( 3 ) ≈ 1.0996541105257052 e − 05 ApEn=\Phi^2(3)-\Phi^3(3)\approx 1.0996541105257052e-05 ApEn=Φ2(3)Φ3(3)1.0996541105257052e05
该值非常小,因此它意味着原时间序列是规则、可预测的,这与观察结果一致.

三、代码实现

Python
(备注:示例程序来自Wikipedia关于Approximate entropy的python实现[2])

import numpy as np

def ApEn(U, m, r):

    def _maxdist(x_i, x_j):
        return max([abs(ua - va) for ua, va in zip(x_i, x_j)])

    def _phi(m):
        x = [[U[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 _maxdist(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(U)

    return abs(_phi(m+1) - _phi(m))

# Usage example
U = np.array([85, 80, 89] * 17)
print ApEn(U, 2, 3)
1.0996541105257052e-05

MATLAB
(备注:示例程序来自matlab社区File Exchange板块,由Kijoon Lee分享[3],在此表示感谢!)

function apen = ApEn( dim, r, data, tau )
%ApEn
%   dim : embedded dimension
%   r : tolerance (typically 0.2 * std)
%   data : time-series data
%   tau : delay time for downsampling

%   Changes in version 1
%       Ver 0 had a minor error in the final step of calculating ApEn
%       because it took logarithm after summation of phi's.
%       In Ver 1, I restored the definition according to original paper's
%       definition, to be consistent with most of the work in the
%       literature. Note that this definition won't work for Sample
%       Entropy which doesn't count self-matching case, because the count
%       can be zero and logarithm can fail.
%
%       A new parameter tau is added in the input argument list, so the users
%       can apply ApEn on downsampled data by skipping by tau.
%---------------------------------------------------------------------
% coded by Kijoon Lee,  kjlee@ntu.edu.sg
% Ver 0 : Aug 4th, 2011
% Ver 1 : Mar 21st, 2012
%---------------------------------------------------------------------
if nargin < 4, tau = 1; end
if tau > 1, data = downsample(data, tau); end

N = length(data);
result = zeros(1,2);

for j = 1:2
    m = dim+j-1;
    phi = zeros(1,N-m+1);
    dataMat = zeros(m,N-m+1);
    
    % setting up data matrix
    for i = 1:m
        dataMat(i,:) = data(i:N-m+i);
    end
    
    % counting similar patterns using distance calculation
    for i = 1:N-m+1
        tempMat = abs(dataMat - repmat(dataMat(:,i),1,N-m+1));
        boolMat = any( (tempMat > r),1);
        phi(i) = sum(~boolMat)/(N-m+1);
    end
    
    % summing over the counts
    result(j) = sum(log(phi))/(N-m+1);
end

apen = result(1)-result(2);

end

以示例数据作为输入,计算得近似熵 a e p n = − 1.099654110681136 e − 05 aepn=-1.099654110681136e-05 aepn=1.099654110681136e05,此结果与Python计算结果一致.

近似熵的优势:[2]
a. 对数据长度的依赖性较小. ApEn可以用于小数据样本( n < 50 n<50 n<50),并可实现实时计算.
b. 抗噪声能力较强. 如果数据含有噪声,则可以将ApEn与噪声水平进行比较,以确定原始数据中真实信息的表达程度.


主要参考资料:

[1]. Pincus, S. M. (1991). “Approximate entropy as a measure of system complexity”. Proceedings of the National Academy of Sciences. 88 (6): 2297–2301. doi:10.1073/pnas.88.6.2297. PMC 51218 Freely accessible. PMID 11607165.
[2]. https://en.wikipedia.org/wiki/Approximate_entropy#cite_note-Pincus21991-23
[3]. https://cn.mathworks.com/matlabcentral/fileexchange/32427-fast-approximate-entropy?s_tid=srchtitle.


后注:由于这是笔者第一次在Markdown编辑器内进行文档编辑,初次采用LaTeX格式进行公式编辑,所以文章中难免出现失误、疏漏之处,还请各位不吝赐教!

  • 65
    点赞
  • 326
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
### 回答1: 在MATLAB中实现近似检测方法需要遵循以下步骤: 1. 首先,需要导入待处理的时间序列数据。可以使用MATLAB中的load命令或csvread命令加载.csv或.txt格式的文件。 2. 接着,需要计算每个数据点和它所在窗口内的其他数据点之间的距离,这可以通过欧几里得距离公式来完成: dist = sqrt(sum(bsxfun(@minus, data, data').^2)); 其中,data是数据矩阵,根据数据矩阵的大小决定窗口的大小。 3. 接下来,需要计算每个点与其他点之间距离的平均值,然后以此来计算其邻近窗口中的值和近似值: for i = 2:win_size for j = 1:(i-1) count(j) = count(j) + (dist(i,j) <= r); end end APEn = sum(log(count./(win_size-1))); SampEn = log(sum(count)/(win_size-1)) - log(sum(count-1)/(win_size-2)); 其中,r是距离的阈值,APEn是平均,SampEn是近似。 4. 最后,可以将计算结果绘制成图表,以便于可视化分析。 通过以上步骤,可以在MATLAB中实现近似检测方法,对时间序列数据进行分析。 ### 回答2: 近似检测方法是一种常用的时间序列分析方法,它可以用于信号处理、故障诊断、数据挖掘等领域。MATLAB是数据处理和分析的常用工具,它提供了方便的计算函数,可以方便地实现近似检测方法。 MATLAB中计算近似的函数为“ApproximateEntropy”,它的语法为:ApEn = ApproximateEntropy(data,m,r)。其中,data表示输入的时间序列数据,m表示的阶数,r表示判定相似的阈值。 代码实现过程如下: 1. 读取时间序列数据:首先需要将待处理的时间序列数据读取到MATLAB中,可以使用load函数或importdata函数读取。 2. 调用ApproximateEntropy函数:使用ApproximateEntropy函数计算近似,传入数据和相应的参数即可。 3. 定义相似度阈值r:r值越小,算法越严格,检测到的异常值越多,但误报率可能会增加。反之,r值越大,算法越宽松,检测到的异常值越少,但漏检率可能会增加。一般可以先设置一个默认值,根据实际情况进行调整。 4. 分析结果:根据输出的结果,分析时间序列中的异常值。如果近似变化较大,则说明时间序列中可能存在异常数据。 例如,使用以下代码实现近似检测方法: x = load('testdata.mat'); % 读取时间序列数据 m = 2; r = 0.2; % 设置相似度阈值 ApEn = ApproximateEntropy(x,m,r); % 使用ApproximateEntropy函数计算近似 if ApEn > threshold % 检测到异常 disp('异常数据!'); else disp('正常数据!'); end 需要注意的是,近似检测方法是一种较为经典的算法,但其局限性也非常明显,因此在实际应用中需要结合具体领域的特点,选择合适的算法进行数据分析。 ### 回答3: 近似检测方法是一种用于分析时间序列的统计方法,它可以检测出时间序列中的重复模式和随机性,并提供一种量化的方法来衡量序列的复杂性。下面是MATLAB中实现近似检测方法的一个简单示例代码。 首先,我们需要载入时间序列数据: data = load('time_series.txt'); 然后,定义近似函数: function e = approximate_entropy(data, m, r) % Compute approximate entropy n = length(data); x = zeros(n-m+1,m); for i = 1:n-m+1 x(i,:) = data(i:i+m-1); end % Compute distances d = zeros(n-m+1,n-m+1); for i = 1:n-m+1 for j = 1:n-m+1 d(i,j) = max(abs(x(i,:)-x(j,:))); end end % Compute probability of similar patterns Cm = zeros(1,n-m+1); for i = 1:n-m+1 for j = 1:n-m+1 if (d(i,j) <= r) Cm(i) = Cm(i) + 1; end end end % Compute approximate entropy e = -sum(log(Cm)/n); 最后,我们使用此函数来计算时间序列数据的近似: m = 2; % embedding dimension r = 0.2; % tolerance e = approximate_entropy(data, m, r); 在这个示例中,我们选择m=2和r=0.2作为参数值。这个函数将计算时间序列数据的近似,并将结果存储在变量e中。你可以根据需要调整这些参数值来控制分析的灵敏度和准确性。
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值