两个三维图像互信息python_Python的互信息实现

我今天遇到了同样的问题。经过几次试验,我发现了真正的原因:如果严格遵循NLP教程,就要学习log2,但是sklearn.metrics.mutual_info_score使用自然对数(以e为基数,欧拉数)。我没有在sklearn文档中找到这个细节。。。

我的确认人是:import numpy as np

def computeMI(x, y):

sum_mi = 0.0

x_value_list = np.unique(x)

y_value_list = np.unique(y)

Px = np.array([ len(x[x==xval])/float(len(x)) for xval in x_value_list ]) #P(x)

Py = np.array([ len(y[y==yval])/float(len(y)) for yval in y_value_list ]) #P(y)

for i in xrange(len(x_value_list)):

if Px[i] ==0.:

continue

sy = y[x == x_value_list[i]]

if len(sy)== 0:

continue

pxy = np.array([len(sy[sy==yval])/float(len(y)) for yval in y_value_list]) #p(x,y)

t = pxy[Py>0.]/Py[Py>0.] /Px[i] # log(P(x,y)/( P(x)*P(y))

sum_mi += sum(pxy[t>0]*np.log2( t[t>0]) ) # sum ( P(x,y)* log(P(x,y)/( P(x)*P(y)) )

return sum_mi

如果你把这个np.log2改成np.log,我想它会给你和sklearn一样的答案。唯一的区别是,当这个方法返回0时,sklearn将返回一个非常接近0的数字。(当然,如果不关心日志库,可以使用sklearn,我的代码只是用于演示,性能很差…)

仅供参考,1)sklearn.metrics.mutual_info_score接受列表和np.array;2)sklearn.metrics.cluster.entropy也使用log,而不是log2

编辑:至于“同一个结果”,我不知道你到底是什么意思。一般来说,向量中的值并不重要,重要的是值的“分布”。你关心的是P(X=X),P(Y=Y)和P(X=X,Y=Y),而不是X,Y的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值