排列熵是哪年提出的,排列熵大小不变,排列熵是什么

  排列熵是哪年提出的,排列熵大小不变,排列熵是什么

  熵表示一种混乱程度,越混乱,熵值越大。顾名思义,排列熵是通过计算前后信号的顺序来计算熵的。先看这篇文章再看:https://blog.csdn.net/FrankieHello/article/details/88245034? UTM _ medium=distribute . PC _ relevant . none-task-blog-blogcommendfrombaudi-12 . control depth _ 1-UTM _ source=distribute . PC _ relevant . none-task-blog-blogcommendfrombaudi-12 . control

  熵排列步骤:对于一组数据x={3,5,2,4,8,0,5,7,9,4,6,7,1,5,2,7,0,3},计算其排列熵如下:1;对于数据集x,根据窗口大小m=计算它

  X=[[3,5,2],

  [5,2,4],

  [2,4,8],

  [4,8,0],

  [8,0,5],

  [0,5,7],

  [5,7,9],

  [7,9,4],

  …

  [2,7,0],

  [7,0,3]]

  (如果时间间隔为t=2,则x=[[3,5,2],[2,4,8],[8,0,5],[5,7,9],[9,4,6] …)

  2.对于矩阵X,将每行从小到大排序(如果有相同的值,则按索引排序),并返回其索引index。例如,对于不同值的[2,1,3],排序后的索引为[1,0,2];对于具有相同[5,4,4]的值,排序索引为[1,2,0]。

  3.从第二步可以得到索引index=[’[2 0 1]’, ‘[1 2 0]’, ‘[0 1 2]’, ‘[2 0 1]’, ‘[1 2 0]’, ‘[0 1 2]’, ‘[0 1 2]’, ‘[2 0 1]’, ‘[1 2 0]’, ‘[0 1 2]’, ‘[2 0 1]’, ‘[1 2 0]’, ‘[0 2 1]’, ‘[1 0 2]’, ‘[2 0 1]’, ‘[1 2 0]’],计算索引值index中同类的个数:counter={[201]: 5,[120]: 5,[012]: 5,[0 2 1]: 1}。每行都有m!(m的阶乘),计数器中每个元素的序列概率可以计算为:P([2 0 1])=5/m!P([1 2 0])=5/m!P([0 1 2])=5/m!P([0 2 1])=1/m!(有人可能会问5 5 5 1m!在实际计算中,必须截取x的长度,使其小于等于m!这里只是方便演示,不做考虑。)

  4.通过以下公式计算排列熵

  **

  Python实现了排列熵:* *

  Def Permutation_Entropy(x,m,t=1):‘‘排列熵’‘#会转换成数组,方便数据处理。x=np.array(x) #如果len(x)m:raise value error( m的值大于x的长度!)#判断t是否大于m if t m: t=m #将x变换为矩阵x=[]if t==1:len=int(len(x)-m 1)else:length=int((len(x)-m 1)/t)1 for I in range(length):x . append,如果是,单独计算loop=1 if len (x) math .阶乘(m): loop=int (len (x)/math。factorial (m)) 1 #将x的每一行从小到大排序,并返回排序后的索引,将索引转换为字符串index=[]for I in x:index . append(str(NP . argsort(I)))#计算排列熵熵=[0]* loop for temp in range(loop):#计算每个索引的个数如果loop==1或temp==loop-1:Count=counter(index[temp * math。阶乘(m):])else:count=counter(index[temp * math。factorial(m):(temp 1)* math . factorial(m)])#在count.keys()中计算I的熵:entropy[temp]=-(count[I]/math . factorial(m))* math . log(count[I]/math . factorial(

  main():# production data x=NP . Lin space(-10,10,2000) #将-10-10区间分成24000份A=[]for I in Range(24000):If I 12000:A . Append(NP .SIN (10 * NP。PI * X[I])Else:a . Append(NP。SIN) NP。COS (50 * x [I]) t=1熵=license _ entropy (a,3,t)print(entropy)PLT . plot(entropy)PLT . title(f t={ t } )PLT . show()if

  当m=3且t=2时:

  当m=3且t=3时:

  从上图可以看出,代码可以从熵值判断不同种类的数据;

  上层程序的输入值前后变化很大。如果减少,可以看到m=3,t=3时的变化:

  main():# production data x=NP . Lin space(-10,10,2000) #将-10-10区间分成24000份A=[]for I in Range(24000):If I 12000:A . Append(NP .SIN (10 * NP。PI * X[I])Else:a . Append(NP。SIN) NP。COS (0.2 * x [I]) t=3熵=license _ entropy (a,3,t) print(熵)PLT.plot(熵)PLT . title(f t={ t } )PLT . show()if

  当m=2且t=2时:

  当m=3且t=3时:

  从上图可以看出,t=3时,基本无法判断前后输入的变化。这是因为当t=3时,X中的每一行数据都不相交。因为我做的数据变化太少,而得到的数据是周期性变化的,所以t=3时基本没有变化。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: