我试图用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));
这段代码相当不可读,但仍然很清楚,这不是离散变量的Shannon熵计算的实现,就像在scipy中实现的那样。相反,这与用于估计连续变量熵的Kozachenko-Leonenko k-最近邻估计量(Kozachenko&Leonenko 1987)类似。在
该估计器的基本思想是查看相邻数据点之间的平均距离。直觉是,如果这个距离很大,数据中的分散性就很大,因此熵也很大。在实际应用中,人们倾向于用k近邻距离代替最近邻距离,这使得估计更加稳健。在
代码显示了一些距离计算
还有一些比固定距离近的点的计数:
^{pr2}$然而,也很明显,这并不完全是Kozachenko-Leonenko估计量,而是它的一些屠宰版本。在
如果你最终想要计算Leonenko估计量,我有一些代码可以解释github的效果:
https://github.com/paulbrodersen/entropy_estimators
编辑:
在看了更多关于这个烂摊子的东西之后,我不再确定他/她是否真的在使用(试图使用?)离散变量的经典香农信息定义,即使输入是连续的:
for循环计算比r更接近的数据点的数量,然后代码段中的最后一行将该数字除以某个间隔,得到一个密度。在
这些密度的总和如下:
但是我们又得到了这些东西公司名称:
以及
我的大脑不相信返回值可能是你的平均值,但我不再百分之百确定。在
不管怎样,如果你想计算一个连续变量的熵,你要么要给你的数据拟合一个分布,要么你应该使用Kozachenko-Leonenko估计量。请写更好的代码。在
相关问题 更多 >
编程相关推荐