互信息中,涉及到熵的概念,首先我们看一下熵如何用python实现。
首先,我们知道,世界的确定性越大,所获取到的信息就会越少,所以对应的信息熵也会越小。所以我们的信息度量是随着概率增加而单调递减的函数。这里我们用的公式为:
I(x_0) = -log(p(x_0))
对于一个属性来说,那么该集合的信息熵为:
H(X) = - \sum_{i=1}^{n}p(x_i)log(p(x_i))
在代码中可以用以下方式实现,其实在python的 sklearn 库中,有现成的计算函数—— mutual_info_score ,计算原理如下。
import numpy as np
from collections import Counter
def entropy(labels):
prob_dict = Counter(labels) #Counter 对相关list 进行计算。
s = sum(prob_dict.values())
probs = np.array([i/s for i in prob_dict.values()]) #计算每个重复函数所占的比率
# result = 0
# for x in probs:
# result += (-x)*np.log(x)
# return result
return -probs.dot(np.log(probs)) # 获取该分类的信息熵
labels_1 = ['a','a','a','c','c','c','s','s']
result= entropy(labels_1)
print(result)
而对于两个不同的属性的互信息,其计算公式为:
I(A,B) = H(A)+H(B)-H(A,B)
同样该方法可以用上面所示的公式计算出来。但是如果我们所用的数据是连续值的话,该方法就不奏效了。这里我们使用邻域互信息的概念。可以参考下面文档:什么是邻域互信息
在邻域互信息中,邻域半径半径 δ 目前并没有有效的方法来确定最优值。大部分论文在该值的获取中,都是使用的 经验法和试凑法。
计算步骤:
计算样本邻域
计算样本不确定性