2017-07-18 62 views
0

我有一个数据集的21个变量和75个数据点/行。我试图调查每对变量之间的相互信息,我在统计学上很新手。我在sklearn.metrics中使用了mutual_info_score函数,这会返回一个大于0的数字。我如何知道mutual_info_score的哪些值反映了依赖关系。例如,你如何知道是否只探索1以上或2以上的值。互信息Python的显着性水平

回答

0

相互信息是一种度量。

import numpy as np 
from sklearn.metrics import mutual_info_score 

np.random.seed(42) 
label_true = np.random.randint(0, 5, 75) 
label_predict = np.random.randint(0, 5, 75) 
print(mutual_info_score(label_true, label_predict)) 

即使有两个独立的随机标签,你会看到非零互信息,

0.117333093974 

你想什么是使用空假设检验探索 - 两个变量是否依赖或不。 (零假设==独立性)

您可以使用独立性测试卡方在scikit学习,

from sklearn.feature_selection import chi2 

statsitic, p_val = chi2(label_true[:, None], label_predict[:, None]) 
if p_val < 0.05: 
    print('dependent') 
else: 
    print('independent') 

对于所有变量对,

import itertools 

data = np.random.randint(0, 5, (75, 21)) 
p_value_matrix = np.zeros((21, 21)) 
for i, j in itertools.combinations(range(21), 2): 
    _, p_val = chi2(data[:, i][:, None], data[:, j][:, None]) 
    p_value_matrix[i, j] = p_value_matrix[j, i] = p_val 

    if p_val < 0.05: 
     print('possibly dependent: {} -- {}'.format(i, j)) 

需要注意的是,0.05是任意(但广泛使用的)门槛拒绝零假设。如果得到的p值大于阈值,我们不能拒绝零假设。

+0

感谢您的回复。我明白第一点是在做什么,只是找到两组变量之间的互信息分数。然而,其余的似乎使用卡方检验作为依赖性的测试,但我的意思是使用互信息作为衡量依赖性的指标,如果有意义的话,它就是某种截断点。我不明白所有变量对的最后一位如何使用互信息? – Janavi

+0

其次,我遇到了将数据集添加到最终部分并将其替换为“数据”变量的问题,因为我的数据不仅仅是整数值。 – Janavi

+0

1.任何中断将是任意的。顺便说一句,如果你可以证明你的选择是正确的,那么使用这种方法就没有问题。 2.如果您有特定类型的数据,则可以探索支持此类数据的独立测试。例如,您可以签出'HSIC'(希尔伯特 - 席米特独立标准),您可以在其中定义两个值之间的接近度。如果你没事的话,你可以使用皮尔逊相关系数的绝对值等。 –