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

2023-05-16

在概率论和信息论中,两个随机变量的互信息(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进行训练
④在测试集上评价特征子集计算错误率
代码
注意使用的数据集是dlbcl,大概五千多维,可以从UCI上下载,最终选择前100特征进行训练。

主函数代码:

clear all
close all
clc;
[X_train,Y_train,X_test,Y_test] = divide_dlbcl();
Y_train(Y_train==0)=-1;
Y_test(Y_test==0)=-1;
% number of features
numF = size(X_train,2);



[ ranking , w] = mutInfFS( X_train, Y_train, numF );
k = 100; % select the Top 2 features
svmStruct = svmtrain(X_train(:,ranking(1:k)),Y_train,'showplot',true);
C = svmclassify(svmStruct,X_test(:,ranking(1:k)),'showplot',true);
err_rate = sum(Y_test~= C)/size(X_test,1); % mis-classification rate
conMat = confusionmat(Y_test,C); % the confusion matrix
fprintf('\nAccuracy: %.2f%%, Error-Rate: %.2f \n',100*(1-err_rate),err_rate);

mutInfFS.m

function [ rank , w] = mutInfFS( X,Y,numF )
rank = [];
for i = 1:size(X,2)
    rank = [rank; -muteinf(X(:,i),Y) i];
end;
rank = sortrows(rank,1);    
w = rank(1:numF, 1);
rank = rank(1:numF, 2);

end

muteinf.m

function info = muteinf(A, Y)
n = size(A,1);%实例数量
Z = [A Y];%所有实例的维度值及标签
if(n/10 > 20)
    nbins = 20;
else
    nbins = max(floor(n/10),10);%设置区间的个数
end;
pA = hist(A, nbins);%min(A)到max(A)划分出nbins个区间出来,求每个区间的概率
pA = pA ./ n;%除以实例数量

i = find(pA == 0);
pA(i) = 0.00001;%不能使某一区间的概率为0

od = size(Y,2);%一个维度
cl = od;
%下面是求实例不同标签的的概率值,也就是频率
if(od == 1)
    pY = [length(find(Y==+1)) length(find(Y==-1))] / n;
    cl = 2;
else
    pY = zeros(1,od);
    for i=1:od
        pY(i) = length(find(Y==+1));
    end;
    pY = pY / n;
end;
p = zeros(cl,nbins);
rx = abs(max(A) - min(A)) / nbins;%每个区间长度
for i = 1:cl
    xl = min(A);%变量的下界
    for j = 1:nbins
        if(i == 2) && (od == 1)
            interval = (xl <= Z(:,1)) & (Z(:,2) == -1);
        else
            interval = (xl <= Z(:,1)) & (Z(:,i+1) == +1);
        end;
        if(j < nbins)
            interval = interval & (Z(:,1) < xl + rx);
        end;
        %find(interval)
        p(i,j) = length(find(interval));

        if p(i,j) == 0 % hack!
            p(i,j) = 0.00001;
        end

        xl = xl + rx;
    end;
end;
HA = -sum(pA .* log(pA));%计算当前维度的信息熵
HY = -sum(pY .* log(pY));%计算标签的信息熵
pA = repmat(pA,cl,1);
pY = repmat(pY',1,nbins);
p = p ./ n;
info = sum(sum(p .* log(p ./ (pA .* pY))));
info = 2 * info ./ (HA + HY);%计算互信息

前100个特征的效果:

Accuracy: 86.36%, Error-Rate: 0.14

选择前两个特征进行训练(压缩率接近100%,把上述代码中的K设为2即可)的二维图:
这里写图片描述
Accuracy: 75.00%, Error-Rate: 0.25

更多内容访问omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2018 • OmegaXYZ-版权所有 转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于互信息的特征选择算法MATLAB实现 的相关文章

  • eclipse svn 分支合并到主干

    首先需厘清SVN的分支以下几个概念 xff1a trunk 主干 可以理解为开发环境的代码 xff0c 平常做开发的工作目录 branches xff1a 从主干拷贝了一份代码重新在svn服务器上的建了个分支目录 通常叫branch xff
  • Python GUI程序整理

    文章目录 GUI程序 Python课程设计Windows系统资源探测器 Python密码存储器 wxpython简单记录生词GUI程序 python微博爬虫GUI程序 Python刷访问量GUI程序 Python弹球游戏 xff08 tki
  • 基于词典的社交媒体内容的情感分析(Python实现)

    之前写了一篇基于NLTK情感预测的文章http www omegaxyz com 2017 12 15 nltk emotion hilite 61 27NLTK 27b 更多内容访问omegaxyz com 情感词典是从微博 新闻 论坛等
  • 在Linux(Ubuntu)下编写编译C语言

    大家都知道在Windows中运行C语言很简单 xff0c 打开一个IDE xff08 VS或者codeblocks xff09 编写代码 xff0c 点击一个按钮就能运行了 在Linux中 xff0c 大家不怎么习惯用IDE xff0c 更
  • 提高C++运行效率的方法

    一 尽量减少值传递 xff0c 多用引用来传递参数 至于其中的原因 xff0c 相信大家也很清楚 xff0c 如果参数是int等语言自定义的类型可能能性能的影响还不是很大 xff0c 但是如果参数是一个类的对象 xff0c 那么其效率问题就
  • 第十三次CCF CSP认证(2018年3月)真题跳一跳

    跳一跳 问题描述 近来 xff0c 跳一跳这款小游戏风靡全国 xff0c 受到不少玩家的喜爱 简化后的跳一跳规则如下 xff1a 玩家每次从当前方块跳到下一个方块 xff0c 如果没有跳到下一个方块上则游戏结束 如果跳到了方块上 xff0c
  • 第十三次CCFCSP认证(2018年3月)真题碰撞的小球

    问题描述 数轴上有一条长度为L xff08 L为偶数 的线段 xff0c 左端点在原点 xff0c 右端点在坐标L处 有n个不计体积的小球在线段上 xff0c 开始时所有的小球都处在偶数坐标上 xff0c 速度方向向右 xff0c 速度大小
  • 第十三次CCF CSP认证(2018年3月)真题URL映射

    问题描述 URL 映射是诸如 Django Ruby on Rails 等网页框架 web frameworks 的一个重要组件 对于从浏览器发来的 HTTP 请求 xff0c URL 映射模块会解析请求中的 URL 地址 xff0c 并将
  • 第十三次CCF CSP认证(2018年3月)真题棋局评估

    问题描述 Alice和Bob正在玩井字棋游戏 井字棋游戏的规则很简单 xff1a 两人轮流往3 3的棋盘中放棋子 xff0c Alice放的是 X xff0c Bob放的是 O xff0c Alice执先 当同一种棋子占据一行 一列或一条对
  • 第十三次CCF CSP认证(2018年3月)真题二次求和

    问题描述 给一棵 n 个节点的树 xff0c 用 1 到 n 的整数表示 每个节点上有一个整数权值 ai 再给出两个整数 L R 现在有 m 个操作 xff0c 每个操作这样描述 xff1a 给定树上两个节点 u v 和一个整数 d xff
  • 演化计算基本方法与思想

    生物系统中 xff0c 进化被认为是一种成功的自适应方法 xff0c 具有很好的健壮性 基本思想 xff1a 达尔文进化论是一种稳健的搜索和优化机制 大多数生物体是通过自然选择和有性生殖进行进化 自然选择决定了群体中哪些个体能够生存和繁殖
  • 发布jar包到Maven中央仓库

    平时自己开发的工具类或者其他的框架的jar包一般都是放在本地 或者把代码上传到github让别人去下载然后自己打包 今天就说说如何把自己的jar包发布到Maven的中央仓库 让其他使用你的jar包的直接去中央仓库下载 如果你用的是阿里云的m
  • 机器学习术语表

    本术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义 原文地址 xff1a https developers google cn machine learning glossary hl 61 zh CN A A B
  • Python单下划线与双下划线

    foo 一种约定 Python内部的名字 用来区别其他用户自定义的命名 以防冲突 foo 一种约定 用来指定变量私有 程序员用来指定私有变量的一种方式 foo 这个有真正的意义 解析器用 classname foo来代替这个名字 以区别和其
  • wxpython控件自适应窗口大小

    问题 xff1a wxpython作的窗口 xff0c 点击窗口最大化 xff0c 就会出问题 xff0c 1 窗口控件并不一起最大化 2 最大化后有些控件找不着了 xff0c 再恢复窗口 xff0c 那些消失的控件一样找不到 wxPyth
  • Python统计磁盘代码文件行数

    听说简历要求10万行代码经验 于是写了个Python脚本用来计算电脑磁盘内代码的行数 主要功能 xff1a 统计指定代码的总行数 统计每个代码单独的行数 自定义设置存储路径 设计思路 xff1a 将文件转化为txt文档 xff0c 对txt
  • 第一个Android程序

    Android Studio 是一个Android集成开发工具 xff0c 基于IntelliJ IDEA 类似 Eclipse ADT xff0c Android Studio 提供了集成的 Android 开发工具用于开发和调试 在ID
  • 面向过程与面向对象代码实例对比

    面向过程式代码 xff08 使用数据结构的代码 xff09 便于在不改动既有数据结构的前提下添加新函数 面向对象代码便于在不改动既有函数前提下添加新类 过程式代码难以添加数据结构 xff0c 因为必须修改所有函数 面向对象代码难以添加新函数
  • 机器学习

    文章目录 机器学习基本理论 基本术语与方法特征选择概述多目标优化问题 分类算法 经典算法 分类算法NSGA2算法粒子群优化算法 xff08 PSO xff09 聚类算法蚁群算法 xff08 ACO xff09 其它算法 前沿算法 NSGA2
  • 英文字母信息熵与冗余度计算Python实现

    26个英文字母在平均出现时的信息熵是4 7BIT 而去掉冗余度后的英文字母的信息熵是4 03BIT 公式 H 信息熵 61 Pi log2 Pi Pi 为每个字母在信息中出现的概率 计算公式并不复杂 取以2为底的对数的道理也很简单 因为如果

随机推荐

  • C++静态成员详解

    静态成员是解决同一个类的不同对象之间数据和函数共享问题的 实例属性 xff1a 一个类的所有对象具有相同的属性 xff0c 属性值可以不同 类属性 xff1a 描述类的所有对象共同特征 xff0c 对于任何对象其属性值相同 静态数据成员 用
  • 混淆矩阵简介与Python实现

    什么是混淆矩阵 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表 xff0c 以矩阵形式将数据集中的记录按照真实的类别与分类模型作出的分类判断两个标准进行汇总 这个名字来源于它可以非常容易的表明多个类别是否有混淆 xff08 也就是一个
  • JAVA CPU占用过高问题排查

    1 查找进程 top查看进程占用资源情况 明显看出java的两个进程22714 xff0c 12406占用过高cpu 2 查找线程 使用top H p lt pid gt 查看线程占用情况 3 查找java的堆栈信息 将线程id转换成十六进
  • 【译】Python3.8官方Logging文档(完整版)

    注 xff1a 文章很长 xff0c 约一万字左右 xff0c 可以先收藏慢慢看哟 01 基础部分 日志是用来的记录程序运行事件的工具 当程序员可以通过添加日志打印的代码来记录程序运行过程中发生的某些事件时 这些事件包含了诸如变量数据在内的
  • C语言银行家算法

    算法简介 银行家算法 xff08 Banker s Algorithm xff09 是一个避免死锁 xff08 Deadlock xff09 的著名算法 xff0c 是由艾兹格 迪杰斯特拉在1965年为T H E系统设计的一种避免死锁产生的
  • 操作系统动态优先级调度算法C语言实现

    动态优先级算法 动态优先数是指在进程创建时先确定一个初始优先数 xff0c 以后在进程运行中随着进程特性的改变不断修改优先数 xff0c 这样 xff0c 由于开始优先数很低而得不到CPU的进程 xff0c 就能因为等待时间的增长而优先数变
  • 软件工程-软件小组的组织形式

    为什么要形成软件小组 大多数软件产品由一个软件专业人员不可能在有限时间内单独完成 因而 xff0c 产品必须分配给一组专业人员 xff0c 形成一个小组 在具体说软件小组的组织形式之前先介绍一下布鲁克斯法则 布鲁克斯法则 布鲁克斯是上世纪6
  • 差分分组的合作协同进化的大规模优化算法详解

    合作协同进化已经引入协同进化算法 xff0c 目的是通过分而治之的范式解决日益复杂的优化问题 理论上 xff0c 协同改 变子成分的想法是十分适合解决大规模优化问题的 然而在实践中 xff0c 没有关于问题的先验知识 xff0c 问题应如何
  • 软件工程内聚详解

    简介 内聚标志一个模块内各个元素彼此结合的紧密程度 xff0c 它是信息隐蔽和局部化概念的自然扩展 内聚是从功能角度来度量模块内的联系 xff0c 一个好的内聚模块应当恰好做一件事 它描述的是模块内的功能联系 内聚和耦合是密切相关的 xff
  • Python使用matplotlib画动态图

    机器学习需要使用python实现相应的算法 xff0c 因此学习了Matplotlib中的画图 更多内容访问omegaxyz com 当然为了能显示机器学习中每次迭代的效果与收敛速度 xff0c 需要画出动态图形 下面给出两个例子 xff0
  • JavaScript模拟终端输出

    利用JavaScript 43 CSS能够模拟出终端输入画面 xff08 类似于Linux终端画面 xff09 当然更好的代码也可以模拟出黑客帝国那样的输出画面 CSS设置 xff1a height auto表示随着输出字数的增加 xff0
  • 机器学习分类与回归

    分类 xff0c 即classification xff1a a process in which you put something into the group or class it belongs to xff0c 这是指将某物放入
  • 边缘计算与嵌入式系统

    文章目录 边缘计算简介 边缘计算的起源 嵌入式系统与边缘计算 3 1 嵌入式系统概述 3 2 嵌入式系统的发展历史 3 3 嵌入式系统应用到边缘计算 3 4 嵌入式硬件的要求 3 5 边缘计算环境下嵌入式系统与人工智能 观点与看法 4 1
  • QQ聊天记录多角度分析Python实现

    简介 有时候我们想看看自己跟另一个人的时长 频率 时间等或者是聊天过程中谁更在乎谁多一点 xff0c 谁是话痨 xff0c 聊天性格怎么样 xff0c 这时就需要一个聊天记录分析的程序 下面的Python代码能够统计聊天记录中的时间 消息次
  • VUE axios 加载中提示封装

    import axios from 39 axios 39 引入axios以及element ui中的loading和message组件 import MessageBox Indicator from 39 mint ui 39 超时时间
  • 百度文库下载器Python实现

    简介 以前可以用学校的企业账户下载文档 xff0c 后来百度文库改版 xff0c 需要买下载券或者会员 因此需要一个百度文库下载器 之前有冰点文库下载器但是后来不好使了 下面给出利用Python写的百度文库下载器 此下载器可以下载doc类型
  • 特征离散化概述

    定义 连续特征离散化是采取各种方法将连续的区间划分为小的区间 xff0c 并将这连续的小区间与离散值关联起来 连续特征离散化的本质是 xff1a 决定选择多少个分割点和确定分割点的位置 背景 连续数据经常采用离散化处理之后再放入模型 离散化
  • 汇编语言辗转相除法求最大公约数

    辗转相除法 xff0c 又名欧几里德算法 xff08 Euclidean algorithm xff09 xff0c 是求最大公约数的一种方法 它的具体做法是 xff1a 用较小数除较大数 xff0c 再用出现的余数 xff08 第一余数
  • JavaScript入门

    什么是JavaScript JavaScript xff0c 也称ECMAScript xff0c 是一种基于对象和事件驱动并具有相对安全性并广泛用于客户端网页开发的脚本语言 xff0c 同时也是一种广泛用于客户端Web开发的脚本语言 Ja
  • 基于互信息的特征选择算法MATLAB实现

    在概率论和信息论中 xff0c 两个随机变量的互信息 xff08 Mutual Information xff0c 简称MI xff09 或转移信息 xff08 transinformation xff09 是变量间相互依赖性的量度 不同于