基于互信息的特征选择算法MATLAB实现

在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息(Mutual Information)是度量两个事件集合之间的相关性(mutual dependence)。互信息最常用的单位是bit。

互信息的定义

正式地,两个离散随机变量 X 和 Y 的互信息可以定义为:

其中 p(x,y) 是 X 和 Y 的联合概率分布函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率分布函数。

在连续随机变量的情形下,求和被替换成了二重定积分:

其中 p(x,y) 当前是 X 和 Y 的联合概率密度函数,而p(x)和p(y)分别是 X 和 Y 的边缘概率密度函数。

互信息量I(xi;yj)在联合概率空间P(XY)中的统计平均值。 平均互信息I(X;Y)克服了互信息量I(xi;yj)的随机性,成为一个确定的量。如果对数以 2 为基底,互信息的单位是bit。

直观上,互信息度量 X 和 Y 共享的信息:它度量知道这两个变量其中一个,对另一个不确定度减少的程度。例如,如果 X 和 Y 相互独立,则知道 X 不对 Y 提供任何信息,反之亦然,所以它们的互信息为零。在另一个极端,如果 X 是 Y 的一个确定性函数,且 Y 也是 X 的一个确定性函数,那么传递的所有信息被 X 和 Y 共享:知道 X 决定 Y 的值,反之亦然。因此,在此情形互信息与 Y(或 X)单独包含的不确定度相同,称作 Y(或 X)的熵。而且,这个互信息与 X 的熵和 Y 的熵相同。(这种情形的一个非常特殊的情况是当 X 和 Y 为相同随机变量时。)

互信息是 X 和 Y 联合分布相对于假定 X 和 Y 独立情况下的联合分布之间的内在依赖性。于是互信息以下面方式度量依赖性:I(X; Y) = 0 当且仅当 X 和 Y 为独立随机变量。从一个方向很容易看出:当 X 和 Y 独立时,p(x,y) = p(x) p(y),因此:

此外,互信息是非负的(即 I(X;Y) ≥ 0; 见下文),而且是对称的(即 I(X;Y) = I(Y;X))。

更多互信息内容请访问:http://www.omegaxyz.com/2018/08/02/mi/

互信息特征选择算法的步骤

  • ①划分数据集
  • ②利用互信息对特征进行排序
  • ③选择前n个特征利用SVM进行训练
  • ④在测试集上评价特征子集计算错误率

缺点

此种特征选择方法是最大化特征与分类变量之间的相关度,就是选择与分类变量拥有最高相关度的前k个变量。但是,在特征选择中,单个好的特征的组合并不能增加分类器的性能,因为有可能特征之间是高度相关的,这就导致了特征变量的冗余。

代码

注意使用的数据集是dlbcl,大概五千多维,可以从UCI上下载,最终选择前100特征进行训练。

主函数代码:

mutInfFS.m

muteinf.m

前100个特征的效果:

Accuracy: 86.36%, Error-Rate: 0.14

选择前两个特征进行训练(压缩率接近100%,把上述代码中的K设为2即可)的二维图:

Accuracy: 75.00%, Error-Rate: 0.25

数据集:https://github.com/xyjigsaw/Dataset

 

44 评论

  1. 请问info是互信息,第二行代码是不是用于将互信息归一化为[0,1]?
    info = sum(sum(p .* log(p ./ (pA .* pY))));
    info = 2 * info ./ (HA + HY);%计算互信息

  2. 您好,请问最后两张图是如何做出来的?我用的基本方式没出来图

  3. 您好,方便发一下dlbcl的数据集吗?github上面那个打不开,请博主发一份yq13835520722@163.com,非常感谢!!

  4. 我想问下,我的数据是有文本和数字的,这个人是A类人,影响因素有男/女,学历(高中/本科/研究生),民族(汉/藏/。。。),年龄(56),这样的混合数据怎么处理呢,我看你自己用的那个数据集都是数字

    • 我想看看这些因素是如何影响这个人的类型的,比如有A,B,C,D四类,这些因素不同可以导致这个人的类型不同,然后计算相关性

  5. 博主还在吗。。。可以给我发一份数据集吗?1160788784@qq.com 万分感谢!

  6. rank = [rank; -muteinf(X(:,i),Y) i];这个地方的-muteinf(X(:,i),Y) i代码是不是有错误啊??

  7. 能否提供一下dlbcl数据集,网上没找到,还请博主发一下sghhrzq@163.com。谢谢了

      • 谢谢了 我还有一个问题 就是在muteinf这个函数中,最后两句代码,info = sum(sum(p .* log(p ./ (pA .* pY))));
        info = 2 * info ./ (HA + HY);%计算互信息,前一个已经计算出来了两个向量的互信息了,最后一句是什么意思啊

  8. 博主您好 如果想实验自己的数据集 应该怎么改呀 我的数据集是.mat格式。小白一只还请解答~^^

  9. 您好,没能在uci上找到dlbcl数据集,能麻烦您提供一下网址吗,非常感谢

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注