mutual information matlab,Mutual information and Normalized Mutual information 互信息和标准化互信息...
实验室最近用到nmi( Normalized Mutual information )评价聚类效果,在网上找了一下这个算法的实现,发现满意的不多.
浙江大学蔡登教授有一个,http://www.zjucadcg.cn/dengcai/Data/code/MutualInfo.m ,他在数据挖掘届地位很高,他实现这个算法的那篇论文引用率高达三位数。但这个实现,恕个人能力有限,我实在是没有看懂:变量命名极为个性,看的如坠云雾;代码倒数第二行作者自己添加注释why complex,我就更不懂了;最要命的是使用他的函数MutualInfo(L1,L2)得到的结果不等于MutualInfo(L2,L1),没有对称性!
还有个python的版本http://blog.sun.tc/2010/10/mutual-informationmi-and-normalized-mutual-informationnmi-for-numpy.html,这个感觉很靠谱,作者对nmi的理解和我是一样的。
我的理解来自wiki和stanford,其实很简单,先说一下问题:例如stanford中介绍的一个例子:
比如标准结果是图中的叉叉点点圈圈,我的聚类结果是图中标注的三个圈。
或者我的结果: A = [1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3];
标准的结果 : B = [1 2 1 1 1 1 1 2 2 2 2 3 1 1 3 3 3];
问题:衡量我的结果和标准结果有多大的区别,若我的结果和他的差不多,结果应该为1,若我做出来的结果很差,结果应趋近于0。
MI可以按照下面的公式计算。X=unique(A)=[1 2 3],Y=unique(B)=[1 2 3];
分子p(x,y)为x和y的联合分布概率,
p(1,1)=5/17,p(1,2)=1/17,p(1,3)=0;
p(2,1)=1/17,p(2,2)=4/17,p(2,3)=1/17;
p(3,1)=2/17,p(3,2)=0,p(3,3)=3/17;
分母p(x)为x的概率函数,p(y)为y的概率函数,x和y分别来自于A和B中的分布,所以即使x=y时,p(x)和p(y)也可能是不一样的。
对p(x): p(1)=6/17p(2)=6/17p(3)=5/17
对p(y): p(1)=8/17p(2)=5/17P(3)=4/17
这样就可以算出MI值了。
标准化互聚类信息也很简单,有几个不同的版本,大体思想都是相同的,都是用熵做分母将MI值调整到0与1之间。一个比较多见的实现是下面所示:
H(X)和H(Y)分别为X和Y的熵,下面的公式中log的底b=2。
例如H(X) = -p(1)*log2(p(1)) - -p(2)*log2(p(2)) -p(3)*log2(p(3))。
matlab实现代码如下
function MIhat = nmi( A, B )
%NMI Normalized mutual information
% http://en.wikipedia.org/wiki/Mutual_information
% http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html
% Author: http://www.cnblogs.com/ziqiao/ [2011/12/13]
if length( A ) ~= length( B)
error('length( A ) must == length( B)');
end
total = length(A);
A_ids = unique(A);
B_ids = unique(B);
% Mutual information
MI = 0;
for idA = A_ids
for idB = B_ids
idAOccur = find( A == idA );
idBOccur = find( B == idB );
idABOccur = intersect(idAOccur,idBOccur);
px = length(idAOccur)/total;
py = length(idBOccur)/total;
pxy = length(idABOccur)/total;
MI = MI + pxy*log2(pxy/(px*py)+eps); % eps : the smallest positive number
end
end
% Normalized Mutual information
Hx = 0; % Entropies
for idA = A_ids
idAOccurCount = length( find( A == idA ) );
Hx = Hx - (idAOccurCount/total) * log2(idAOccurCount/total + eps);
end
Hy = 0; % Entropies
for idB = B_ids
idBOccurCount = length( find( B == idB ) );
Hy = Hy - (idBOccurCount/total) * log2(idBOccurCount/total + eps);
end
MIhat = 2 * MI / (Hx+Hy);
end
% Example :
% (http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html)
% A = [1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3];
% B = [1 2 1 1 1 1 1 2 2 2 2 3 1 1 3 3 3];
% nmi(A,B)
% ans = 0.3646
为了节省运行时间,将for循环用矩阵运算代替,1百万的数据量运行 1.795723second,上面的方法运行3.491053 second;
但是这种方法太占内存空间, 五百万时,利用matlab2011版本的内存设置就显示Out of memory了。
function MIhat = nmi( A, B )
%NMI Normalized mutual information
% http://en.wikipedia.org/wiki/Mutual_information
% http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html
% Author: http://www.cnblogs.com/ziqiao/ [2011/12/15]
if length( A ) ~= length( B)
error('length( A ) must == length( B)');
end
total = length(A);
A_ids = unique(A);
A_class = length(A_ids);
B_ids = unique(B);
B_class = length(B_ids);
% Mutual information
idAOccur = double (repmat( A, A_class, 1) == repmat( A_ids', 1, total ));
idBOccur = double (repmat( B, B_class, 1) == repmat( B_ids', 1, total ));
idABOccur = idAOccur * idBOccur';
Px = sum(idAOccur') / total;
Py = sum(idBOccur') / total;
Pxy = idABOccur / total;
MImatrix = Pxy .* log2(Pxy ./(Px' * Py)+eps);
MI = sum(MImatrix(:))
% Entropies
Hx = -sum(Px .* log2(Px + eps),2);
Hy = -sum(Py .* log2(Py + eps),2);
%Normalized Mutual information
MIhat = 2 * MI / (Hx+Hy);
% MIhat = MI / sqrt(Hx*Hy); another version of NMI
end
% Example :
% (http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html)
% A = [1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3];
% B = [1 2 1 1 1 1 1 2 2 2 2 3 1 1 3 3 3];
% nmi(A,B)
% ans = 0.3646
参考: stanford的讲解:http://nlp.stanford.edu/IR-book/html/htmledition/evaluation-of-clustering-1.html
wiki百科的讲解:http://en.wikipedia.org/wiki/Mutual_information
某作者的python的实现:http://blog.sun.tc/2010/10/mutual-informationmi-and-normalized-mutual-informationnmi-for-numpy.html
蔡登的matlab实现:http://www.zjucadcg.cn/dengcai/Data/code/MutualInfo.m
mutual information matlab,Mutual information and Normalized Mutual information 互信息和标准化互信息...相关推荐
- Normalized Mutual information
在写论文做数据测试时有用到一个nmi(normalized mutual information)评价聚类的一种方法,不是很清楚,然后上网找了一下资料. 首先在理解nmi前,先说说mutual inf ...
- NMI(Normalized Mutual Information)
NMI(Normalized Mutual Information) NMI(Normalized Mutual Information),归一化互信息.常用在聚类中,度量两个聚类结果的相近程度(通常 ...
- 计算两个向量的互信息(Mutual Information) matlab程序
互信息,Mutual Information,缩写为MI,用来计算两个变量X与Y是否有关系,以及关系的强弱 function [Ixy,lambda]=MutualInfo(X,Y) %% % Est ...
- 聚类算法评价指标——Normalized Mutual Information, NMI指数
目录 NMI 是一种常见的聚类有效性外部评价指标,从信息论的角度评估了两个聚类结果的相似性 . 设实验结果为 X,真实结果为 Y,则其计算式如下: 其中,I(X,Y)I (X,Y)I(X,Y)表示 X ...
- 使用Matlab SPM12与MRIcroGL进行头核磁ROI的标准化与Overlap图的制作
目的:使用SPM12将原始的T1WI图像以及ROI文件标准化至MNI152脑空间,以及使用MRIcroGL制作脑损伤的Overlay热图: 使用软件:Matlab2021b for mac,SPM12 ...
- matlab数据无量纲化_MATLAB数据预处理——归一化和标准化
输入/输出数据的预处理 尺度变换 尺度变换也称归一化或标准化,是指通过变换处理将网络的输入/输出数据限制在[0,1]或[-1,1]区间内.进行尺度变换的原因有: (1)网络的各个输入数据常常具有不同的 ...
- matlab中CH指标聚类评价指标,MATLAB聚类有效性评价指标(外部)
MATLAB聚类有效性评价指标(外部) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看标签:MATLAB.聚类 前提:数据的真实标签已知 ...
- 高数篇(四)-- 互信息概述与matlab实现
在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度.不同于相关系数,互信息并不局限于实值随 ...
- MATLAB聚类有效性评价指标(外部)
MATLAB聚类有效性评价指标(外部) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看标签:MATLAB.聚类 前提:数据的真实标签已知 ...
最新文章
- 关于cocopod命令
- 素数判定算法 MILLER RABIN
- 从用户不足2000万到27亿,这项技术真要上天了?
- pwm一个时间单位_PTO PWM要点
- 6.QT-简易计算器实现(详解)
- ATIchinapay银联支付模块.zip
- 【学习笔记】子集生成的方法
- 多元统计分析教材推荐
- 关于多目标跟踪的一点理解
- c语言逻辑运算符用法大全,C语言逻辑运算符介绍和示例
- 对照ArcGIS坐标系统文件(.prj)用Deskpro完成投影转换
- Java高级技术FastDFS的学习
- 双击word文档提示向程序发送命令出现问题(There was a problem sending the command to the program)
- 解决swiper动态改变数据后分页混乱问题
- kafka中文文档new comsumer配置参数
- python+selenium之元素、下拉列表的定位
- MRR@K P@K R@K意义阐述与对比
- 有哪些工具或者软件堪称神器?
- adreno源码系列(五)打开kgsl
- 推荐几个海外优秀的新闻网站[中文]
热门文章
- 【Qt】QtIFW 安装包制作总结 -如何创建多组件的安装器
- 迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程
- 微信小程序如何获取高清用户头像
- python的拼音_python 中文分词和拼音首字母
- 主磁盘分区和逻辑磁盘分区的区别是什么?
- ios不能保存png_管理各种iOS设备文件的管理软件
- 获取Minecraft服务器信息API,Minecraft快速实现Yggdrasil API正版验证
- 豪斯曼检验matlab,豪斯曼检验、空间面板模型选择等问题
- 【系统分析师之路】第七章 复盘系统设计(业务流程建模)
- UVA 10158 (记忆化搜索)