matlab中如何计算两组数据的互信息,或者如何计算联合熵,为什么我算出来都是负值 求解!!急

matlab中如何计算两组数据的互信息,或者如何计算联合熵,为什么我算出来都是负值 求解!!急,第1张

L(i,j)=mm(i)*mm2(j) 这一条意味着两渣孝个变量相互独立,最终答案肯定为0,

m=[78.3 13.2 4.32 4.32 72 24.5 33.9 679 143 20 26.7 46.9 230 159.8 128 215.6 139 139 70.2 129.6 ]

m = mapminmax(m,0,1)

m2=[78.61 96.98 81.86 82.91 81.35 83.95 78.76 85.72 83.98 84.47 84.73 76.14 124.69 124.69 124.69 623.47 124.69 124.69 18.75 630.02 ]

m2 = mapminmax(m2,0,1)

Y=hist3([m',m2'])/100

mm=sum(Y,1)

mm2=sum(Y,2)

mm2=mm2'如茄稿

%

% mm=hist(m)/10

% mm

mm(mm==0) = [ ]

% mm

Hm = -sum(mm.*log2(mm))

Hm

mm2(mm2==0) = [ ]

mm2

Hm2 = -sum(mm2.*log2(mm2))

Hm2

Y=reshape(Y,1,100)

Y(Y==0)=[]

Hab=-sum(sum(Y.*log2(Y)))

disp('Hab信源联合纳迅熵为:')

Hab

%计算a和b的互信息

mi =( Hm+Hm2)-Hab

mi

1、熵是描述区域的随机程度的,P=ΣC*logC,C是灰度概率值,当图像均匀时,各灰度值的概率基本相等,熵可以达到最大

2、例程:

#include<iostream.h>

#include<液桥math.h>

int i,j

double rowsum(double table[][4],int nrow)//定义第i行的边际概率函数

{

for(i=0i<nrowi++)

{

   for( j=1j<4j++)

    table[i][0]+=table[i][j] 

}

return 0

}

double liesum(double table[4][4],int nlie)//定义第j列的边际概率函数

{ for( j=0j<nliej++)

{

   for( i=1i<4i++)

    table[0][j]+=table[i][j]

}

    return 0

}

void main()

double p[4][4]={{1.0/8.0,1.0/16.0,1.0/32.0,1.0/32.0},{1.0/16.0,1.0/8.0,1.0/32.0,1.0/32.0},

{1.0/16.0,1.0/16.0,1.0/16.0,1.0/16.0},{1.0/4.0,0.0,0.0,0.0}}

for ( i=0i<4i++)//输出概率矩阵

{

   for ( j=0j<4j++)

    cout<<p[i][j]<<" "

   磨埋肢   cout<<endl      

}cout<<endl 

rowsum(p,4)//调用函数输出第i行的边际概率 

for (i =0i<4i++)

{cout<<"第"<<i<<"行的边际概率p"<<"["<<i<<"]"<<"是"<<p[i][0]<<endl}cout<<endl

liesum(p,4)//调用函数输出第j列的边际概率

for ( j =0j<4j++)

{cout<<"第"<<j<<"列的条件概率p"<<"["<<j<<"]"<<"是"<<p[0][j]<<endl}cout<<endl

// double p[4][4]

double H1=0.0

for( i=0i<4i++)

{H1+=p[i][0]*(log((1.0/p[i][0])/log(2.0)))}

    double H2=0.0

for( j=0j<4j++)

{H2+=p[0][j]*(log((1.0/p[0][j])/log(2.0)))}

    double H3=0.0 

for(i=0i<3i++)

for(j=0j<4j++) 

{H3+=p[i][j]*(log(1.0/p[i][j])/log(2.0))}

H3+=p[4][1]*(log(1.0/p[4][1])/log(2.0))

    cout<<"X的熵:H(X)="<<H1<<endl

cout<<"Y的熵:H(Y)="<<H2<<endl

    cout<<"(X,Y)的熵:H(X,Y)="<<H3<<endl

cout<<endl

cout<<"条件熵:H(X|Y)="<<H3-H2<<endl

cout<<"条件熵:H(Y|X)="<<H3-H1<<endl

cout<<"互信息:I(XY)="<<H1+H2-H3<<endl

int size=4//定义联合概率p为维数组

double *p

p=new double[size] 

for ( i=0i<4i++)//联合概率计算

{

   for ( j=0j<4j++)

   {

      /*int nSize 

            scanf( "%d", &nSize ) 

            int *p = ( int* )malloc( sizeof( int ) * nSize ) 

            for( int i = 0 i < nSize i++ ) 

            p[ i ] = 0

            

    double table[4][4]

        p[i]=pp[0][i]*table[i][j]

    cout<<"联合概率"<<"p"<<"["<<i<<"]"<<"["<<j<<"]""是"<<p[i]<<endl

   

   }

}

for ( i=0i<4i++)//联合熵的计算

{

   for ( j=0j<4j++)

   {   

   

   // H+=p[i][j]*log(1.0/p[i][j])

    H+=p[i]*(log((1.0/p[i])/log(2.0)))

   }

}

cout<<"联合H(x,y)熵为"<<H<<瞎世endl

delete []p */

}

香农 被称为是“信息论之父”。人们通常将香农于1948年10月发表于《贝尔系统技术学报》上的 论文 《A Mathematical Theory of Communication》(通信的数学理论)作为现代信息论研究的开端。在该文中,香农首次给出了信息熵(以下简称为“熵”)的定义,

熵在数据挖掘中的决策树,以及特征工程中都有应用。通过互信息的变化,来决定决策树中决策变量的选择,以及特征工程因变量的选择。以配局下介绍几个常用的基本概念。

熵是表示随机变量不确定性的度量,X 是一个取有限值的离散随机变量,其概率分布为:

则随机变量X的熵定义为

当随机变量仅有两个值时,可以绘制熵随两个随机变量概率变化的图像如下:

可以看出,当随机变量取值的概率为0或1时,熵最小,完全培轮让没有不确定性。而当随机

变量的概率取值为0.5时,熵最大,随机变量的不确定性也就最大。

当随机变量为多维随机变量时,其联合概率分布为:

条件熵H(Y|X),表示已知随机变量X的条件下随机变量Y的不确定性,定义为X给定条件下Y的条件概率分布的熵对X的数学期望:

信息增益表示特征X的信息使得Y的信息的不确定桐岩性减少的程度,定义为集合D的经验熵H(D)与特征A给定的条件下D的经验熵H(D|A)之差:

熵与条件熵只差称为互信息。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12506557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存