关于本博客的说明: 本次博客主要分享样本熵(Sample Entropy, SampEn, SE)的理论相关知识及其代码实现.

一、理论基础

**样本熵(SampEn)**是基于近似熵(ApEn)的一种用于度量时间序列复杂性的改进方法,在评估生理时间序列的复杂性和诊断病理状态等方面均有应用[1].
由于样本熵是近似熵的一种改进方法,因此可以将其与近似熵联系起来理解.

算法表述如下:

  1. 设存在一个以等时间间隔采样获得的样本熵python代码 样本熵的单位_样本熵维的时间序列样本熵python代码 样本熵的单位_样本熵_02.
  2. 定义算法相关参数样本熵python代码 样本熵的单位_SE_03,样本熵python代码 样本熵的单位_SE_04,其中,样本熵python代码 样本熵的单位_SE_03为整数,表示比较向量的长度,样本熵python代码 样本熵的单位_SE_04为实数,表示“相似度”的度量值.
  3. 重构样本熵python代码 样本熵的单位_SE_03维向量样本熵python代码 样本熵的单位_样本熵python代码_08,其中样本熵python代码 样本熵的单位_SampEn_09.
  4. 对于样本熵python代码 样本熵的单位_样本熵python代码_10,统计满足以下条件的向量个数样本熵python代码 样本熵的单位_Sample entropy_11
    其中,样本熵python代码 样本熵的单位_样本熵python代码_12定义为样本熵python代码 样本熵的单位_SampEn_13
    样本熵python代码 样本熵的单位_样本熵python代码_14为向量样本熵python代码 样本熵的单位_Sample entropy_15的元素,样本熵python代码 样本熵的单位_Sample entropy_16表示向量样本熵python代码 样本熵的单位_Sample entropy_17样本熵python代码 样本熵的单位_SampEn_18的距离,由对应元素的最大差值决定,样本熵python代码 样本熵的单位_SampEn_19的取值范围为样本熵python代码 样本熵的单位_SE_20,但是样本熵python代码 样本熵的单位_SampEn_21.
  5. 样本熵python代码 样本熵的单位_样本熵_22对所有样本熵python代码 样本熵的单位_样本熵_23值的平均值,记为样本熵python代码 样本熵的单位_SE_24,即样本熵python代码 样本熵的单位_SE_25.
  6. 样本熵python代码 样本熵的单位_Sample entropy_26,重复步骤3-4,得样本熵python代码 样本熵的单位_样本熵_27,其中样本熵python代码 样本熵的单位_样本熵python代码_28
  7. 则样本熵(SampEn)定义为样本熵python代码 样本熵的单位_样本熵python代码_29
    由于在实际计算应用过程中,样本熵python代码 样本熵的单位_样本熵不可能为样本熵python代码 样本熵的单位_样本熵_31,因此当样本熵python代码 样本熵的单位_样本熵取有限值时,样本熵估计为样本熵python代码 样本熵的单位_SE_33

其中, 样本熵python代码 样本熵的单位_SE_34表示自然对数,样本熵python代码 样本熵的单位_SE_35样本熵python代码 样本熵的单位_SE_36由第2步定义.
参数选择:嵌入维数样本熵python代码 样本熵的单位_SE_35一般取1或2;相似容限样本熵python代码 样本熵的单位_SE_36的选择在很大程度上取决于实际应用场景,通常选择样本熵python代码 样本熵的单位_SE_39,其中样本熵python代码 样本熵的单位_样本熵_40表示原时间序列的标准差.

近似熵与样本熵理论上的对比[2]
样本熵python代码 样本熵的单位_Sample entropy_41为维数为样本熵python代码 样本熵的单位_SE_35时,时间序列的自相似概率;样本熵python代码 样本熵的单位_样本熵python代码_43为维数为样本熵python代码 样本熵的单位_Sample entropy_44时,时间序列的自相似概率,得出样本熵python代码 样本熵的单位_样本熵_45。近似熵的计算是以样本熵python代码 样本熵的单位_SE_46为模型,并且计算出了所有模型的平均值。为了防止出现计算样本熵python代码 样本熵的单位_Sample entropy_47的情况,近似熵在算法的第4步中包含了与自身向量的比较,这种方式与新信息观点是不相容的,所以一定会存在偏差。不同的是,样本熵计算的是和的对数,且不包含与自身向量的比较,所以其优势在于包含更大的样本熵python代码 样本熵的单位_SE_48,以及更加准确的样本熵python代码 样本熵的单位_SampEn_49估计.
与近似熵相比,样本熵具有两个优势:样本熵的计算不依赖数据长度;样本熵具有更好的一致性,即参数样本熵python代码 样本熵的单位_SE_35样本熵python代码 样本熵的单位_SE_36的变化对样本熵的影响程度是相同的.

二、代码实现

Python
(备注:示例程序是根据上文算法在Wikipedia关于Sample entropy的python实现代码上进行修改后得到的[1])

# SampEn calculation

import numpy as np

def SampEn(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)]
          B = [(len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) - 1.0) / (N - m) for x_i in x]
          return (N - m + 1.0)**(-1) * sum(B)

     N = len(U)

     return -np.log(_phi(m+1) / _phi(m))

# Usage example
U = np.array([85, 80, 89] *17)
print(SampEn(U,2,3))

令输入数据为一个以3为周期的周期时间序列,维度样本熵python代码 样本熵的单位_SE_52,即
样本熵python代码 样本熵的单位_样本熵_53
设定参数:嵌入维度样本熵python代码 样本熵的单位_样本熵_54,相似容限样本熵python代码 样本熵的单位_样本熵_55
程序输出样本熵 样本熵python代码 样本熵的单位_Sample entropy_56

MATLAB
(备注:示例程序是根据上文算法在Kijoon Lee分享的样本熵代码“SampE”[3]的基础上修改得来的,在此表示感谢!)

% notification: this is a modification work based on that of Kijoon Lee.
function saen = SampEntropy( dim, r, data, tau )
% SAMPEN Sample Entropy
%   calculates the sample entropy of a given time series data

%   SampEn is conceptually similar to approximate entropy (ApEn), but has
%   following differences:
%       1) SampEn does not count self-matching. The possible trouble of
%       having log(0) is avoided by taking logarithm at the latest step.
%       2) SampEn does not depend on the datasize as much as ApEn does. The
%       comparison is shown in the graph that is uploaded.

%   dim     : embedded dimension
%   r       : tolerance (typically 0.2 * std)
%   data    : time-series data
%   tau     : delay time for downsampling (user can omit this, in which case
%             the default value is 1)
%

if nargin < 4, tau = 1; end
if tau > 1, data = downsample(data, tau); end

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

for m = dim:dim+1
    Bi = 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 j = 1:N-m+1
        % calculate Chebyshev distance, excluding self-matching case
        dist = max(abs(dataMat - repmat(dataMat(:,j),1,N-m+1)));
        % calculate Heaviside function of the distance
        % User can change it to any other function
        % for modified sample entropy (mSampEn) calculation
        D = (dist <= r);
        % excluding self-matching case
        Bi(j) = (sum(D)-1)/(N-m);
    end
    
    % summing over the counts
    result(m-dim+1) = sum(Bi)/(N-m+1);
    
end

saen = -log(result(2)/result(1));

end

采用与Python实现代码相同的计算数据与参数,得到样本熵为样本熵python代码 样本熵的单位_SampEn_57,此结果与Python计算结果一致.


参考文献:
[1]. https://en.wikipedia.org/wiki/Sample_entropy
[2]. 李立,曹锐,相洁.脑电数据近似熵与样本熵特征对比研究[J].计算机工程与设计,2014,35(03):1021-1026.
[3]. https://cn.mathworks.com/matlabcentral/fileexchange/35784-sample-entropy?s_tid=srchtitle