熵python实现

2024-04-23 19:06:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python重写这个matlab/octaverepo。我找到了一个熵函数的实现(见下文)。经过一番研究,我在google上发现我可以将scipy's entropy implementation用于python。但是在读了更多关于scipy的熵公式(例如s=-sum(pk*log(pk),axis=0)),我怀疑这两个计算的是同一个东西。。。在

有人能证实我的想法吗?在

%�������� author by YangSong 2010.11.16 C230
%file:ys_sampEntropy.m
% code is called from line 101 of algotrading.m
%  =>   entropy180(i)=ys_sampEntropy(kmeans180s1(i,1:180));
% where kmeans180s1 is an array of size 100x181 containing the kmeans  
% centroids and the prize label at position 181.  

function sampEntropy=ys_sampEntropy(xdata)
m=2;
n=length(xdata);
r=0.2*std(xdata);%ƥ��ģ��������ֵ
%r=0.05;
cr=[];
gn=1;
gnmax=m;
while gn<=gnmax
      d=zeros(n-m+1,n-m);% ���ž��������ľ���  
      x2m=zeros(n-m+1,m);%���ű任�������      
      cr1=zeros(1,n-m+1);%���Ž����ľ���
      k=1;

      for i=1:n-m+1

          for j=1:m
              x2m(i,j)=xdata(i+j-1);
          end

      end
      x2m;

      for i=1:n-m+1

          for j=1:n-m+1

              if i~=j
                 d(i,k)=max(abs(x2m(i,:)-x2m(j,:)));%��������Ԫ�غ���ӦԪ�صľ���
                 k=k+1;
              end

          end

          k=1;
      end
      d;

      for i=1:n-m+1
          [k,l]=size(find(d(i,:)<r));%����RС�ĸ������͸�L
          cr1(1,i)=l;
      end
      cr1;

      cr1=(1/(n-m))*cr1;
      sum1=0;

      for i=1:n-m+1

          if cr1(i)~=0
             %sum1=sum1+log(cr1(i));
             sum1=sum1+cr1(i);
          end  %if����

      end  %for����

      cr1=1/(n-m+1)*sum1;
      cr(1,gn)=cr1;
      gn=gn+1;
      m=m+1;
end        %while����
cr;

sampEntropy=log(cr(1,1))-log(cr(1,2));

Tags: logforifzerosscipyendcrpk
1条回答
网友
1楼 · 发布于 2024-04-23 19:06:39

这段代码相当不可读,但仍然很清楚,这不是离散变量的Shannon熵计算的实现,就像在scipy中实现的那样。相反,这与用于估计连续变量熵的Kozachenko-Leonenko k-最近邻估计量(Kozachenko&Leonenko 1987)类似。在

该估计器的基本思想是查看相邻数据点之间的平均距离。直觉是,如果这个距离很大,数据中的分散性就很大,因此熵也很大。在实际应用中,人们倾向于用k近邻距离代替最近邻距离,这使得估计更加稳健。在

代码显示了一些距离计算

d(i,k)=max(abs(x2m(i,:)-x2m(j,:)));

还有一些比固定距离近的点的计数:

^{pr2}$

然而,也很明显,这并不完全是Kozachenko-Leonenko估计量,而是它的一些屠宰版本。在

如果你最终想要计算Leonenko估计量,我有一些代码可以解释github的效果:

https://github.com/paulbrodersen/entropy_estimators

编辑:

在看了更多关于这个烂摊子的东西之后,我不再确定他/她是否真的在使用(试图使用?)离散变量的经典香农信息定义,即使输入是连续的:

  for i=1:n-m+1
      [k,l]=size(find(d(i,:)<r));%����RС�ĸ������͸�L
      cr1(1,i)=l;
  end
  cr1;

  cr1=(1/(n-m))*cr1;

for循环计算比r更接近的数据点的数量,然后代码段中的最后一行将该数字除以某个间隔,得到一个密度。在

这些密度的总和如下:

  for i=1:n-m+1

      if cr1(i)~=0
         %sum1=sum1+log(cr1(i));
         sum1=sum1+cr1(i);
      end  %if����

  end  %for����

但是我们又得到了这些东西公司名称:

  cr1=1/(n-m+1)*sum1;
  cr(1,gn)=cr1;

以及

sampEntropy=log(cr(1,1))-log(cr(1,2));

我的大脑不相信返回值可能是你的平均值,但我不再百分之百确定。在

不管怎样,如果你想计算一个连续变量的熵,你要么要给你的数据拟合一个分布,要么你应该使用Kozachenko-Leonenko估计量。请写更好的代码。在

相关问题 更多 >