關於排列熵的一些理解與解釋
針對這兩天學習排列熵的疑問,根據上述理論與連結程式碼進行理解的基礎上,將matlab程式碼增添了一些註釋,使得能詳細的說明其原理。
此外,需要說明的是。
“(3) 計算每一種符號序列出現的次數除以m!種不同的符號序列出現的總次數作為該重構分量的概率。”
- 針對於所構建的K行m列矩陣,若取出某一行進行排序,可獲得排序後的序列。由於矩陣中任一行的列數為m,m個數進行全排,其排列後的種類應為m!種。
- 針對矩陣的第1行,對其進行排序,那麼此時這個序列應該必定為m!種的1種。
- 若矩陣的所有行之間排序的索引均不相同,若按照上述總次數的理解,則每行的概率應該為1/(m!)。其實並非如此,因為分母並不是m!,而是“出現的總次數”,未出現的不計算在內。
- 比如,最簡單的,假設矩陣的所有行之間排序的索引均不相同,那麼K行矩陣就出現K種排序。總的次數應該為K個1相加。由於均不相同,其頻數均為1,則每行的概率應均為1/K。
- 那麼若存在矩陣的所有行之間排序的索引相同的情況下內,我們只需要統計種類。比如K行中的第1和第2行排序後,索引序列相同,那麼我們將該索引序列的頻數記為2,後續第3行至第K行均不同,則頻數均分別為1。此時總的次數依然為K。但是第1種和第2種一共佔有2/K。第3行至第K行均佔有1/K。
- 由於佔的比重不同,最後利用比重進行求和時,則,該公式中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
相關文章
- 關於交叉熵的個人理解熵
- 關於position的一些理解
- 關於Netty的一些理解、實踐與陷阱Netty
- 關於position定位的一些理解
- 關於元素排列的DFS
- 理解"熵"熵
- 關於遊標的一些理解
- 關於Dart中Future的一些理解Dart
- 關於Swift中Properties的一些理解Swift
- 關於Base64的一些理解
- 關於服務高可用的一些理解
- 關於01揹包個人的一些理解
- 關於虛擬函式的一些理解函式
- 熵、聯和熵與條件熵、交叉熵與相對熵是什麼呢?詳細解讀這裡有!熵
- 關於跨域和JSONP的一些理解跨域JSON
- 關於 Python 裝飾器的一些理解Python
- 關於 Node.js scoped module 的一些理解Node.js
- 關於如何解釋機器學習的一些方法機器學習
- 關於MySQL的一些小見解MySql
- 關於react我的理解與總結React
- 關於 Python 裝飾器的一些個人理解Python
- 關於spring事務原始碼的一些小理解Spring原始碼
- 關於阿里JAVA開發手冊的一些理解阿里Java
- 關於NSDate,NSDateFormatter,NSTimeZone的一些通俗理解ORM
- 關於西門子間接定址的一些理解
- 關於Oracle Cluster Software-----下面的解釋更通俗,容易理解Oracle
- 關於Vue的元件與模板的初步理解Vue元件
- 關於 Laravel 的一些個人見解Laravel
- 重新理解熵編碼熵
- 關於微信小程式佈局排列微信小程式
- 熵、交叉熵及似然函式的關係熵函式
- 關於程式與執行緒的一個簡單解釋執行緒
- 關於若干選舉演算法的解釋與實現演算法
- 交叉熵、相對熵及KL散度通俗理解熵
- 關於效率、程式與生活的一些思考
- 關於Flutter空安全的一些使用經驗和理解Flutter
- 關於Array.reduce的理解與擴充
- 關於maven的核心pom(專案物件模型)的一些理解Maven物件模型