互信息python意义水平

时间:2017-07-18 14:14:23

标签: python dependencies data-analysis entropy

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

1 个答案:

答案 0 :(得分: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

您想要探索的是使用零假设检验 - 两个变量是否相关。 (null假设==独立)

您可以使用测试来实现独立性,例如:在scikit-learn中的chi2,

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值大于阈值,我们不能拒绝零假设。