和分解的边缘分布的乘积的相似程度。互信息(Mutual Information)是度量两个事件集合之间的相关性(mutual dependence)。互信息最常用的单位是bit
。
1 互信息定义
1.1 原始定义
和,其联合概率分布函数为,而边缘概率分布函数分别为和,其互信息可以定义为:
在连续随机变量的情形下,是和的联合概率密度函数,而和分别是和的边缘概率密度函数,求和被替换成了二重积分:
在联合概率空间中的统计平均值。 平均互信息克服了互信息量的随机性,成为一个确定的量。如果对数以 2 为基底,互信息的单位是bit
。
和共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果和相互独立,则知道不对提供任何信息,反之亦然,所以它们的互信息为零。在另一个极端,如果是的一个确定性函数,且也是的一个确定性函数,那么传递的所有信息被和共享:知道决定的值,反之亦然。因此,在此情形下,互信息(或)单独包含的不确定度相同,称作(或)的熵。而且,这个互信息与的熵和的熵相同。(这种情形的一个非常特殊的情况是当 和为相同随机变量时。)
和联合分布相对于假定和独立情况下的联合分布之间的内在依赖性。于是互信息以下面方式度量依赖性:,当且仅当和为独立随机变量。从一个方向很容易看出:当和独立时,,因此:
1.2 用熵表示互信息
,其离散熵可以定义为:
其中: 花体表示为包含所有小元素的集合,以2为底。
一个随机变量的熵越大,意味着不确定性越大,换言之,该随机变量包含的信息量越大。必然是事件是确定无疑的,并不含有不确定性,所以必然事件的熵应该是0,也就是说,必然事件不含有信息量。
接下来推导如何用熵表示互信息:
1. 离散型
2. 连续型
经过推导后,我们可以直观地看到表示为原随机变量的信息量,为知道事实后的信息量,互信息则表示为知道事实后,原来信息量减少了多少。用Venn
图表示:
图1 互信息、条件熵与联合熵
看作一个随机变量不确定度的量度,那么就是没有涉及到的的部分的不确定度的量度。这就是“在已知之后的剩余不确定度的量”,于是第一个等式的右边就可以读作“的不确定度,减去在已知之后的剩余不确定度的量”,此式等价于“移除知道后的不确定度的量”。这证实了互信息的直观意义为知道其中一个变量提供的另一个的信息量(即不确定度的减少量)。
,于是。因此,我们可以制定”一个变量至少包含其他任何变量可以提供的与它有关的信息“的基本原理。
2 性质与应用
2.1 常用性质
1. 非负性
由图1可知:,则
2. 对称性
3. 与条件熵和联合熵的关系
4. 与K-L散度的关系
2.2 应用领域
- 通信中,信道容量是最大互信息
-
k-means
,互信息被用作优化目标 - 隐马尔可夫模型训练,可以采用最大互信息(MMI)标准。
-
RNA
结构,可以从多序列比对预测RNA
二级结构。 - 互信息已被用作机器学习中的特征选择和特征变换的标准。它可用于表征变量的相关性和冗余性,例如最小冗余特征选择。
- 互信息用于确定数据集的两个不同聚类的相似性。
- 单词的互信息通常用作语料库语言学中搭配计算的重要函数。
- 医学成像中,互信息可以用于进行图像配准。
- 时间序列分析中,可以用于相位同步的检测。
- 互信息用于学习贝叶斯网络/动态贝叶斯网络的结构,这被认为可以解释随机变量之间的因果关系。
- 决策树学习中,是一种
loss function
。
2.3 其他形式
1. 条件互信息
可以简写为:
2. 方向信息(Directed Information)
,方向互信息:
3. 与相关系数的关系
互信息其中包含所有独立性(线性和非线性),不像correlation coefficients measures
一样只包含线性。对于互信息与相关系数的关系,可以参考这篇博客:https://stats.stackexchange.com/questions/81659/mutual-information-versus-correlation
的联合概率分布服从二元正态分布时,有以下性质:是相关系数
证明如下:
所以,
3 代码实现
实现一:基于直方图
% function: main.m
clc
u1 = rand(4,1);
u2 = [2;32;6666;5];
wind_size = size(u1,1);
mi = calmi(u1, u2, wind_size);
% function: calmi.m
% u1:输入计算的向量1
% u2:输入计算的向量2
% wind_size:向量的长度
function mi = calmi(u1, u2, wind_size)
x = [u1, u2];
n = wind_size;
[xrow, xcol] = size(x);
bin = zeros(xrow,xcol);
pmf = zeros(n, 2);
for i = 1:2
minx = min(x(:,i));
maxx = max(x(:,i));
binwidth = (maxx - minx) / n;
edges = minx + binwidth*(0:n);
histcEdges = [-Inf edges(2:end-1) Inf];
[occur,bin(:,i)] = histc(x(:,i),histcEdges,1); %通过直方图方式计算单个向量的直方图分布
pmf(:,i) = occur(1:n)./xrow;
end
%计算u1和u2的联合概率密度
jointOccur = accumarray(bin,1,[n,n]); %(xi,yi)两个数据同时落入n*n等分方格中的数量即为联合概率密度
jointPmf = jointOccur./xrow;
Hx = -(pmf(:,1))'*log2(pmf(:,1)+eps);
Hy = -(pmf(:,2))'*log2(pmf(:,2)+eps);
Hxy = -(jointPmf(:))'*log2(jointPmf(:)+eps);
MI = Hx+Hy-Hxy;
mi = MI/sqrt(Hx*Hy); % 标准化互信息,两种形式 NMI=2*MI/(Hx+Hy) 和 NMI=MI/sqrt(Hx*Hy)
histc函数制定数值边界为分界条件
histc
以 a=[1 2 3 4 5 6 7 8 9 0 ], edges=1:2:7 为例。
[n,bin]=histc(x,edges) 返回n=[2 2 2 1], bin=[ 1 1 2 2 3 3 4 0 0 0]。
edges=1:2:7即总共有三个数值分界,分别为1<=x<3, 3<=x<5, 5<=x<7,
n(1)=2表示a中落在第一个范围的数总共有两个,1和2;
n(2)=2表示a中落在第二个范围的数总共有两个,3和4;
n(3)=2表示a中落在第三个范围的数总共有两个,5和6;
n(4)=1表示a中的值等于edges最后一个值7的个数为1。
bin的值为a中的值分别在edges
的哪个范围中(1就是在edges
的第一个空中),若不在edges
范围中,则返回0。
- 上述代码C++实现:标准化互信息NMI计算步骤和C++代码(Normalized Mutual Information)
- Python代码实现:NMI(标准化互信息) python实现
- stanford的讲解:https://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html
- 互信息和标准化互信息:
实现二:基于正态核的多变量核密度估计
原理介绍:请阅读:Estimation of mutual information using kernel density estimators和Jackknife approach to the estimation of mutual information
function [Ixy,lambda]=MutualInfo(X,Y)
%%
% Estimating Mutual Information with Moon et al. 1995
% between X and Y
% Input parameter
% X and Y : data column vectors (nL*1, nL is the record length)
%
% Output
% Ixy : Mutual Information
% lambda: scaled mutual information similar comparabble to cross-correlation coefficient
%
% Programmed by
% Taesam Lee, Ph.D., Research Associate
% INRS-ETE, Quebecc
% Hydrologist
% Oct. 2010
%
%
X=X';
Y=Y';
d=2;
nx=length(X);
hx=(4/(d+2))^(1/(d+4))*nx^(-1/(d+4));
Xall=[X;Y];
sum1=0;
for is=1:nx
pxy=p_mkde([X(is),Y(is)]',Xall,hx);
px=p_mkde([X(is)],X,hx);
py=p_mkde([Y(is)],Y,hx);
sum1=sum1+log(pxy/(px*py));
end
Ixy=sum1/nx;
lambda=sqrt(1-exp(-2*Ixy));
%% Multivariate kernel density estimate using a normal kernel
% with the same h
% input data X : dim * number of records
% x : the data point in order to estimate mkde (d*1) vector
% h : smoothing parameter
function [pxy]=p_mkde(x,X,h);
s1=size(X);
d=s1(1);
N=s1(2);
Sxy=cov(X');
sum=0;
% p1=1/sqrt((2*pi)^d*det(Sxy))*1/(N*h^d);
% invS=inv(Sxy);
detS=det(Sxy);
for ix=1:N
p2=(x-X(:,ix))'*(Sxy^(-1))*(x-X(:,ix));
sum=sum+1/sqrt((2*pi)^d*detS)*exp(-p2/(2*h^2));
end
pxy=1/(N*h^d)*sum;
参考
- 互信息公式及概述:https://www.omegaxyz.com/2018/08/02/mi/
- 列向量互信息计算通用MATLAB代码:https://cloud.tencent.com/developer/article/1827416
- 计算两个向量的互信息(Mutual Information) matlab程序:
- 互信息的介绍:https://www.zhihu.com/question/304499706/answer/544609335
- 信息论(1)——熵、互信息、相对熵:https://zhuanlan.zhihu.com/p/36192699
- 基于互信息的特征选择算法MATLAB实现:https://www.omegaxyz.com/2018/08/03/mifs/