【问题标题】:Calculating the mutual information between two random vectors returns the same value计算两个随机向量之间的互信息返回相同的值
【发布时间】:2022-12-18 12:31:12
【问题描述】:

我想计算两个 numpy 向量之间的互信息:

>>>from sklearn.metrics.cluster import mutual_info_score
>>>import numpy as np

>>>a, b = np.random.rand(10), np.random.rand(10)
>>>mutual_info_score(a, b)
1.6094379124341005

>>>a, b = np.random.rand(10), np.random.rand(10)
>>>mutual_info_score(a, b)
1.6094379124341005

如您所见,虽然我更新了ab,但它返回了相同的值。然后我尝试了另一个例子:

>>>a = np.array([167.52523295,  73.2904335 ,  98.61953303, 152.17297007,
       211.01341451, 327.72296346, 356.60500081,  43.9371432 ,
       119.09474284, 125.20180842])

>>>b = np.array([280.9287028 , 131.76304983, 176.0277832 , 188.56630096,
       229.09811401, 228.47200012, 617.67000122,  52.7211511 ,
       125.95361582, 148.55247447])

>>>mutual_info_score(a, b)
2.302585092994046


>>>a = np.array([ 6.71381009,  1.43607653,  3.78729242, -4.75706796, -3.81281173,
        3.23440092, 10.84495625, -0.19646145,  4.09724507, -0.13858104])

>>>b = np.array([ 4.25330873,  3.02197642, -3.2833848 ,  0.41855662, -3.74693531,
        0.7674982 , 11.36459148,  0.64636462,  0.51817262,  1.65318943])

>>>mutual_info_score(a, b)
2.302585092994046

为什么?看看这些数字之间的差异。为什么它返回相同的值?更重要的是,如何计算两个向量之间的 MI?

【问题讨论】:

    标签: python mutual-information


    【解决方案1】:

    在这种情况下,您每次运行单元时都会获得不同的数字。在这里,您正在使用一种适合衡量聚类结果质量的方法!
    让我们快速进入主要材料。为了观察两个向量(甚至几个向量)之间的互信息(MI),您可以使用mutual_info_regression函数(如here所述):

    In [1]: from sklearn.feature_selection import mutual_info_regression
    
    In [2]: a, target = np.random.rand(10, 3)+300, np.random.rand(10)
    
    In [3]: mi = mutual_info_regression(a, target)
    
    In [4]: mi
    Out[4]: array([0.18373016, 0.19396825, 0.09634921])
    

    在上面,我计算了atarget的每个特征之间的MI!例如,第一个特征和 target 之间的 MI 是 ~0.184。有多种方法可以计算变量之间的 MI,例如:

    • 用直方图估计互信息 (MI)。例如,代码:

      from sklearn.metrics import mutual_info_score
      
      def MI(x, y, bins):
          c_xy = np.histogram2d(x, y, bins)[0]
          mi = mutual_info_score(None, None, contingency=c_xy)
          return mi
      

      这里的挑战是为bins 的数量找到合适的值。 [1]

    • 基于 k-最近邻距离的熵估计(mutual_info_regression 基于这种方法)

    • 等等

    附言阅读this文档是值得的。

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多