实验室最近用到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 互信息和标准化互信息...相关推荐

  1. Normalized Mutual information

    在写论文做数据测试时有用到一个nmi(normalized mutual information)评价聚类的一种方法,不是很清楚,然后上网找了一下资料. 首先在理解nmi前,先说说mutual inf ...

  2. NMI(Normalized Mutual Information)

    NMI(Normalized Mutual Information) NMI(Normalized Mutual Information),归一化互信息.常用在聚类中,度量两个聚类结果的相近程度(通常 ...

  3. 计算两个向量的互信息(Mutual Information) matlab程序

    互信息,Mutual Information,缩写为MI,用来计算两个变量X与Y是否有关系,以及关系的强弱 function [Ixy,lambda]=MutualInfo(X,Y) %% % Est ...

  4. 聚类算法评价指标——Normalized Mutual Information, NMI指数

    目录 NMI 是一种常见的聚类有效性外部评价指标,从信息论的角度评估了两个聚类结果的相似性 . 设实验结果为 X,真实结果为 Y,则其计算式如下: 其中,I(X,Y)I (X,Y)I(X,Y)表示 X ...

  5. 使用Matlab SPM12与MRIcroGL进行头核磁ROI的标准化与Overlap图的制作

    目的:使用SPM12将原始的T1WI图像以及ROI文件标准化至MNI152脑空间,以及使用MRIcroGL制作脑损伤的Overlay热图: 使用软件:Matlab2021b for mac,SPM12 ...

  6. matlab数据无量纲化_MATLAB数据预处理——归一化和标准化

    输入/输出数据的预处理 尺度变换 尺度变换也称归一化或标准化,是指通过变换处理将网络的输入/输出数据限制在[0,1]或[-1,1]区间内.进行尺度变换的原因有: (1)网络的各个输入数据常常具有不同的 ...

  7. matlab中CH指标聚类评价指标,MATLAB聚类有效性评价指标(外部)

    MATLAB聚类有效性评价指标(外部) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看标签:MATLAB.聚类 前提:数据的真实标签已知 ...

  8. 高数篇(四)-- 互信息概述与matlab实现

    在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度.不同于相关系数,互信息并不局限于实值随 ...

  9. MATLAB聚类有效性评价指标(外部)

    MATLAB聚类有效性评价指标(外部) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多内容,请看标签:MATLAB.聚类 前提:数据的真实标签已知 ...

最新文章

  1. 关于cocopod命令
  2. 素数判定算法 MILLER RABIN
  3. 从用户不足2000万到27亿,这项技术真要上天了?
  4. pwm一个时间单位_PTO PWM要点
  5. 6.QT-简易计算器实现(详解)
  6. ATIchinapay银联支付模块.zip
  7. 【学习笔记】子集生成的方法
  8. 多元统计分析教材推荐
  9. 关于多目标跟踪的一点理解
  10. c语言逻辑运算符用法大全,C语言逻辑运算符介绍和示例
  11. 对照ArcGIS坐标系统文件(.prj)用Deskpro完成投影转换
  12. Java高级技术FastDFS的学习
  13. 双击word文档提示向程序发送命令出现问题(There was a problem sending the command to the program)
  14. 解决swiper动态改变数据后分页混乱问题
  15. kafka中文文档new comsumer配置参数
  16. python+selenium之元素、下拉列表的定位
  17. MRR@K P@K R@K意义阐述与对比
  18. 有哪些工具或者软件堪称神器?
  19. adreno源码系列(五)打开kgsl
  20. 推荐几个海外优秀的新闻网站[中文]

热门文章

  1. 【Qt】QtIFW 安装包制作总结 -如何创建多组件的安装器
  2. 迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程
  3. 微信小程序如何获取高清用户头像
  4. python的拼音_python 中文分词和拼音首字母
  5. 主磁盘分区和逻辑磁盘分区的区别是什么?
  6. ios不能保存png_管理各种iOS设备文件的管理软件
  7. 获取Minecraft服务器信息API,Minecraft快速实现Yggdrasil API正版验证
  8. 豪斯曼检验matlab,豪斯曼检验、空间面板模型选择等问题
  9. 【系统分析师之路】第七章 复盘系统设计(业务流程建模)
  10. UVA 10158 (记忆化搜索)