算法原理(2):樣本熵(SampEn)

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/u011389706/article/details/80984209

  本文主要介紹樣本熵的物理意義、算法以及Matlab裏代碼實現。

1.物理意義

  樣本熵(Sample Entropy,SampEn)與近似熵的物理意義相似(近似熵參見博客【近似熵理論相關知識與代碼實現】),都是通過度量信號中產生新模式的概率大小來衡量時間序列複雜性,新模式產生的概率越大,序列的複雜性就越大。
  與近似熵相比,樣本熵具有兩個優勢:樣本熵的計算不依賴數據長度樣本熵具有更好的一致性,即參數m和r的變化對樣本熵的影響程度是相同的。
  樣本熵的值越低,序列自我相似性就越高;樣本熵的值越大,樣本序列就越複雜。目前樣本熵在評估生理時間序列(EEG,sEMG等)的複雜性和診斷病理狀態等方面均有應用。

2.計算方法

  樣本熵的計算方法如下:

3.代碼實現

  在Matlab裏實現樣本熵函數,計算一段時間序列的樣本熵值,代碼如下:

function SampEnVal = SampEn(data, m, r)
% SampEn  計算時間序列data的樣本熵
% 輸入:data是數據一維行向量
%      m重構維數,一般選擇12,優先選擇2,一般不取m>2
%      r 閾值大小,一般選擇r=0.1~0.25*Std(data)
% 輸出:SampEnVal樣本熵值大小

data = data(:)';
N = length(data);
Nkx1 = 0;
Nkx2 = 0;

for k = N - m:-1:1
    x1(k, :) = data(k:k + m - 1);
    x2(k, :) = data(k:k + m);
end

for k = N - m:-1:1
    x1temprow = x1(k, :);
    x1temp    = ones(N - m, 1)*x1temprow;   
    dx1(k, :) = max(abs(x1temp - x1), [], 2)';   
    Nkx1 = Nkx1 + (sum(dx1(k, :) < r) - 1)/(N - m - 1);    
    x2temprow = x2(k, :);
    x2temp    = ones(N - m, 1)*x2temprow;
    dx2(k, :) = max(abs(x2temp - x2), [], 2)';
    Nkx2      = Nkx2 + (sum(dx2(k, :) < r) - 1)/(N - m - 1);
end
Bmx1 = Nkx1/(N - m);
Bmx2 = Nkx2/(N - m);
SampEnVal = -log(Bmx2/Bmx1);
end

  包含更詳細註釋的代碼,可以點擊這裏下載【樣本熵Matlab函數】
  enjoy!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章