Python';政府推行互相资讯

Python';政府推行互相资讯,python,machine-learning,feature-selection,Python,Machine Learning,Feature Selection,我在实现Python的机器学习库提供的互信息功能时遇到了一些问题,特别是: sklearn.metrics.mutual\u info\u score(labels\u true,labels\u pred,contractive=None) () 我正在尝试实现斯坦福NLP教程网站中的示例: 该网站位于以下位置: 问题是我一直得到不同的结果,但还没有找到原因 我得到了互信息和特性选择的概念,我只是不明白它是如何在Python中实现的。我所做的是,基于NLP站点示例,我提供了带有两个数组的mu

我在实现Python的机器学习库提供的互信息功能时遇到了一些问题,特别是: sklearn.metrics.mutual\u info\u score(labels\u true,labels\u pred,contractive=None)

()

我正在尝试实现斯坦福NLP教程网站中的示例:

该网站位于以下位置:

问题是我一直得到不同的结果,但还没有找到原因


我得到了互信息和特性选择的概念,我只是不明白它是如何在Python中实现的。我所做的是,基于NLP站点示例,我提供了带有两个数组的mutual_info_score方法,但它输出不同的结果。另一个有趣的事实是,不管怎样,在这些数组上进行操作和更改数字,都很可能得到相同的结果。我应该使用另一种特定于Python的数据结构吗?或者这背后的问题是什么?如果过去有人成功使用过此功能,将对我有很大帮助,谢谢您抽出时间。

我今天遇到了同样的问题。经过几次试验后,我发现了真正的原因:如果严格遵循NLP教程,您可以使用log2,但sklearn.metrics.mutual_info_分数使用自然对数(基数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\u info\u score
采用列表和np.array;2)
sklearn.metrics.cluster.entropy也使用log,而不是log2


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

下面的代码应该提供一个结果:

0.000110558610110256

c=np.concatenate([np.ones(49), np.zeros(27652), np.ones(141), np.zeros(774106) ])
t=np.concatenate([np.ones(49), np.ones(27652), np.zeros(141), np.zeros(774106)])

computeMI(c,t)

你应该给我们提供一个“错误”的工作示例。你能给出一个运行示例吗?我在[1,2,2],[1,2,2]上得到了不同的值作为这个例程和相互信息分数的参数