简介
互信息(Mutual Information)是信息论中的概念,用来衡量两个随机变量之间的相互依赖程度。对于Mutual Information的介绍会用到KL散度(Kullback–Leibler divergence)的知识,可以参考//www.greatytc.com/p/00254c4d0931。
定义
互信息可以定义为两个随机变量的联合分布与边缘分布的乘积的KL散度。
根据上述定义,不难发现,如果随机变量和相互独立,即,则;
性质
1 ,由KL Divergence的性质可以直接得出
2
Pf:
其中表示熵,同理可以证明
通过性质2,我们可以从另一个角度认识互信息。比如可以视为已知之后,的不确定性减少的程度;同理,可以视为已知之后,的不确定性减少的程度.
Code
这里我们直接使用归一化之后的互信息,经过归一化之后,互信息的取值范围为[0,1]
import numpy as np
from scipy.stats import pearsonr
import matplotlib.pyplot as plt
from sklearn.metrics.cluster import normalized_mutual_info_score
rng = np.random.RandomState(1) #保证每次生成相同的随机序列
x = rng.normal(0, 5, size = 10000)
y = np.sin(x)
plt.scatter(x,y)
plt.xlabel('x')
plt.ylabel('y = sin(x)')
r = pearsonr(x,y)[0]
nmi = normalized_mutual_info_score(x,y)
数据分布如下所示:
这里我们将pcc的结果和nmi的结果进行对比,对于如上数据,pcc的结果为0.00083,完全没有相关性。而nmi的结果为1,表明x和y有很强的依赖关系。