關於排列熵的一些理解與解釋

阿爾法先生發表於2020-12-05

 

排列熵的主要原理可見連結1連結2


針對這兩天學習排列熵的疑問,根據上述理論與連結程式碼進行理解的基礎上,將matlab程式碼增添了一些註釋,使得能詳細的說明其原理。


此外,需要說明的是。

“(3) 計算每一種符號序列出現的次數除以m!種不同的符號序列出現的總次數作為該重構分量的概率。”

  1. 針對於所構建的K行m列矩陣,若取出某一行進行排序,可獲得排序後的序列。由於矩陣中任一行的列數為m,m個數進行全排,其排列後的種類應為m!種。
  2. 針對矩陣的第1行,對其進行排序,那麼此時這個序列應該必定為m!種的1種。
  3. 若矩陣的所有行之間排序的索引均不相同,若按照上述總次數的理解,則每行的概率應該為1/(m!)。其實並非如此,因為分母並不是m!,而是“出現的總次數”,未出現的不計算在內。
  4. 比如,最簡單的,假設矩陣的所有行之間排序的索引均不相同,那麼K行矩陣就出現K種排序。總的次數應該為K個1相加。由於均不相同,其頻數均為1,則每行的概率應均為1/K。
  5. 那麼若存在矩陣的所有行之間排序的索引相同的情況下內,我們只需要統計種類。比如K行中的第1和第2行排序後,索引序列相同,那麼我們將該索引序列的頻數記為2,後續第3行至第K行均不同,則頻數均分別為1。此時總的次數依然為K。但是第1種和第2種一共佔有2/K。第3行至第K行均佔有1/K。
  6. 由於佔的比重不同,最後利用比重進行求和時,則-sum(p.*log(p)),該公式中p即為比重。

排列熵 matlab程式碼

%% 主函式呼叫排列熵函式求時間序列的排列熵值

[m,n]=size(X);  % X為時間序,一行為一個時間序列。

% 相空間重構:eDim為嵌入維數,eLag為延遲時間
% 當X具有多列和多行時,每列將被視為獨立的時間序列,該演算法對X的每一列假設相同的時間延遲和嵌入維度,並以標量返回ESTDIM和ESTLAG。
[~,eLag,eDim] = phaseSpaceReconstruction(X);

% 求排列熵:pe為排列熵
pe=zeros(1,m);
for i=1:m
    [pe(i),~] = pec(X(i,:),eDim,eLag);
end

%% 排列熵演算法
function [pe ,hist] = pec(y,m,t)

%  Calculate the permutation entropy

%  Input:   y: time series;
%           m: order of permuation entropy 嵌入維數
%           t: delay time of permuation entropy,延遲時間

% Output: 
%           pe:    permuation entropy
%           hist:  the histogram for the order distribution

ly = length(y);
permlist = perms(1:m); 
% perms函式可將某個向量生成一個矩陣,利用該向量的內容進行排列。比如本例中的1,2,3,4,...,(m-1),m這個向量。其無序排列的結果有m!種,將m!種排到一個矩陣,為m!*m矩陣

[h,l]=size(permlist);
c(1:length(permlist))=0;
%生成一個1*m!的均為0的向量。其實用zeros更好。c=zeros(1,length(permlist))
    
 for j=1:ly-t*(m-1)
     [~,iv]=sort(y(j:t:j+t*(m-1)));
%對構建的矩陣的每一行進行排列,獲得其在原始資料中的索引值(即位置)iv
     for jj=1:h
         if (abs(permlist(jj,:)-iv))==0
%在m!種可能性中遍歷所有行,找出是否與該當前的索引值存在相同,若相同,則在0向量c中的jj列上的值+1,結束後,換矩陣的另一行繼續找相同的索引值。總計K行。
             c(jj) = c(jj) + 1 ;
         end
     end
 end
hist = c;
c=c(find(c~=0));
%find為找出向量c中的所有的非0統計數的位置。c(find)為利用位置找出C中所有的非0數。即挑出所有的非0陣列成向量c。

p = c/sum(c);%統計向量中所有數佔的比重。
pe = -sum(p .* log(p));%利用比重進行求和。
end

 

相關文章