Excellence is a continuous process and not an accident.

卓越是一个持续的过程而不是一个偶然事件。

原文地址:https://dreamhomes.github.io/posts/202005120940.html

标准化互信息NMI计算步骤及其Python实现

假设对于17个样本点(v1,v2,...,v17)(v_1,v_2,...,v_{17})(v1​,v2​,...,v17​)进行聚类:

某一种算法得到聚类结果为:

A=[1 2 1 1 1 1 1 2 2 2 2 3 1 1 3 3 3]

标准的聚类结果为:

B=[1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3]

问题:需要度量算法结果与标准结果之间的相似度,如果结果越相似NMI值应接近1;如果算法结果很差则NMI值接近0。

根据公式计算MI的值其中X=unique(A)=[1 2 3] , Y=unique(B)=[1 2 3]:

MI(X,Y)=∑i=1∣X∣∑j=1∣Y∣P(i,j)log(P(i,j)P(i)P′(j))MI(X,Y)=\sum_{i=1}^{|X|}\sum_{j=1}^{|Y|}P(i,j)log(\frac{P(i,j)}{P(i)P^{'}(j)})MI(X,Y)=i=1∑∣X∣​j=1∑∣Y∣​P(i,j)log(P(i)P′(j)P(i,j)​)

首先计算上式分子中联合概率分布P(i,j)=∣Xi∩Yj∣NP(i,j)=\frac{|X_i\cap Y_j|}{N}P(i,j)=N∣Xi​∩Yj​∣​

P(1,1)=5/17,P(1,2)=1/17,P(1,3)=2/17P(1,1)=5/17,P(1,2)=1/17,P(1,3)=2/17P(1,1)=5/17,P(1,2)=1/17,P(1,3)=2/17

P(2,1)=1/17,P(2,2)=4/17,P(2,3)=0P(2,1)=1/17,P(2,2)=4/17,P(2,3)=0P(2,1)=1/17,P(2,2)=4/17,P(2,3)=0

P(3,1)=0,P(3,2)=1/17,P(3,3)=3/17P(3,1)=0,P(3,2)=1/17,P(3,3)=3/17P(3,1)=0,P(3,2)=1/17,P(3,3)=3/17

再计算分母中概率函数P(i)=Xi/NP(i)=X_i/NP(i)=Xi​/N,P(i)P(i)P(i)为iii的概率分布函数,P′(j)P^{'}(j)P′(j)为jjj的概率分布函数:

对于P(i)P(i)P(i):

P(1)=8/17,P(2)=5/17,p(3)=4/17P(1)=8/17,P(2)=5/17,p(3)=4/17P(1)=8/17,P(2)=5/17,p(3)=4/17

对于P(j)P(j)P(j):

P′(1)=6/17,P′(2)=6/17,P′(3)=5/17P^{'}(1)=6/17,P^{'}(2)=6/17,P^{'}(3)=5/17P′(1)=6/17,P′(2)=6/17,P′(3)=5/17

根据以上计算可以计算出MI的值。

至于标准化互信息使用第二个公式计算:

NMI(X,Y)=2MI(X,Y)H(X)+H(Y)NMI(X,Y)=\frac{2MI(X,Y)}{H(X)+H(Y)}NMI(X,Y)=H(X)+H(Y)2MI(X,Y)​

上式分母中H(X),H(Y)H(X),H(Y)H(X),H(Y)分别为X,YX,YX,Y的熵:

H(X)=−∑i=1∣X∣P(i)log(P(i));H(Y)=−∑j=1∣Y∣P′(j)log(P′(j))H(X)=-\sum_{i=1}^{|X|}P(i)log(P(i));H(Y)=-\sum_{j=1}^{|Y|}P^{'}(j)log(P^{'}(j))H(X)=−i=1∑∣X∣​P(i)log(P(i));H(Y)=−j=1∑∣Y∣​P′(j)log(P′(j))

对于上面的例子,根据公式计算熵如下:

H(X)=P(1)log2(P(1))+P(2)log2(P(2))+P(3)log2(P(3))H(X)=P(1)log_2(P(1))+P(2)log_2(P(2))+P(3)log_2(P(3))H(X)=P(1)log2​(P(1))+P(2)log2​(P(2))+P(3)log2​(P(3))

H(Y)=P′(1)log2(P′(1))+P′(2)log2(P′(2))+P′(3)log2(P′(3))H(Y)=P^{'}(1)log_2(P^{'}(1))+P^{'}(2)log_2(P^{'}(2))+P^{'}(3)log_2(P^{'}(3))H(Y)=P′(1)log2​(P′(1))+P′(2)log2​(P′(2))+P′(3)log2​(P′(3))

综上则可以计算出NMI的值。

代码实现以上计算过程:

  • 可以直接调用scikit-learn包中集成的度量函数
  • 自己编写函数实现计算过程

Python代码实现如下(包含上述两种方式):

# -*- coding:utf-8 -*-
'''
Created on 2017年10月28日@summary: 利用Python实现NMI计算@author: dreamhome
'''
import math
import numpy as np
from sklearn import metrics
def NMI(A,B):#样本点数total = len(A)A_ids = set(A)B_ids = set(B)#互信息计算MI = 0eps = 1.4e-45for idA in A_ids:for idB in B_ids:idAOccur = np.where(A==idA)idBOccur = np.where(B==idB)idABOccur = np.intersect1d(idAOccur,idBOccur)px = 1.0*len(idAOccur[0])/totalpy = 1.0*len(idBOccur[0])/totalpxy = 1.0*len(idABOccur)/totalMI = MI + pxy*math.log(pxy/(px*py)+eps,2)# 标准化互信息Hx = 0for idA in A_ids:idAOccurCount = 1.0*len(np.where(A==idA)[0])Hx = Hx - (idAOccurCount/total)*math.log(idAOccurCount/total+eps,2)Hy = 0for idB in B_ids:idBOccurCount = 1.0*len(np.where(B==idB)[0])Hy = Hy - (idBOccurCount/total)*math.log(idBOccurCount/total+eps,2)MIhat = 2.0*MI/(Hx+Hy)return MIhatif __name__ == '__main__':A = np.array([1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3])B = np.array([1,2,1,1,1,1,1,2,2,2,2,3,1,1,3,3,3])print NMI(A,B)print metrics.normalized_mutual_info_score(A,B)

标准化互信息NMI计算步骤及其Python实现相关推荐

  1. python计算互信息_标准化互信息NMI计算步骤及其Python实现

    Excellence is a continuous process and not an accident. 卓越是一个持续的过程而不是一个偶然事件. 标准化互信息NMI计算步骤及其Python实现 ...

  2. 互信息python代码_转:标准化互信息NMI计算步骤及其Python实现

    标准化互信息NMI计算步骤 Python 实现 代码: ''' 利用Python实现NMI计算''' import math import numpy as np from sklearn impor ...

  3. 社团划分评估-标准化互信息NMI的Python实现

    标准化互信息nmi是评估社团划分质量的一项重要指标,我在网上找了很久没有找到能用的,干脆自己参照公式写了一个,如果对你有帮助,请一键三连. 首先附上论文地址 NMI的公式定义如下: 最后附上代码: # ...

  4. 社区发现的3个评估指标:标准化互信息NMI,ARI指标,以及模块度(modularity)

    原文地址: 一.已知真实社区划分结果 1.NMI指数,互信息和标准化互信息 具体公式和matlab代码参见博客,Python代码参加,C++代码参见 1 2 3 4 5 6 7 8 9 10 11 1 ...

  5. 社区发现的3个评估指标:标准化互信息NMI,ARI指标,以及模块度(modularity)...

    转载请注明出处:http://www.cnblogs.com/bethansy/p/6890972.html 一.已知真实社区划分结果 1.NMI指数,互信息和标准化互信息 具体公式和matlab代码 ...

  6. 聚类的评价指标NMI标准化互信息+python实现+sklearn调库

    聚类的评价指标NMI标准化互信息+python实现+sklearn调库 概念 引例 公式 信息熵 相对熵(relative entropy) 互信息 *归一化互信息(NMI) 代码 python sk ...

  7. 聚类效果评价指标:MI, NMI, AMI(互信息,标准化互信息,调整互信息)

    聚类效果评价指标:MI, NMI, AMI(互信息,标准化互信息,调整互信息) 简介 在无监督学习中,常见的两种任务为聚类与降维.这里给出三个聚类效果评价指标:互信息,标准化互信息,调整互信息(MI, ...

  8. python数据标准化1002无标题,Scikit标准化互信息学习给我错误的值

    我是Python新手,我试图看到两个不同信号之间的标准化互信息,不管我使用什么信号,我得到的结果总是1,我认为这是不可能的,因为信号是不同的,不是完全相关的. 我使用的是Normalized Mutu ...

  9. python1乘到10_python写一个循环1+到10打印计算步骤的脚本——纯粹无聊玩的

    python写一个循环1+到10打印计算步骤的脚本--纯粹无聊玩的 python写一个循环1+到10打印计算 [root@13cml10 ~]# cat a.py #_*_coding:utf-8_* ...

最新文章

  1. 分享EOS加拿大的文章《REX——从源代码做技术解析》
  2. php使mysql显示错误_如何针对依赖用户输入的长查询在PHP中显示MySQL错误?
  3. Visual Studio 如何创建C/C++项目
  4. Java集合之LinkedList
  5. 【渝粤题库】广东开放大学 传播学理论与实务 形成性考核
  6. 告知书页面html样式,后院通知编辑页面.html
  7. VMware vCenter Server Appliance Photon OS安全修补程序
  8. 光电雷达智能跟踪平台
  9. java hmget 最大值,【Redis】基本数据类型及命令操作(超详细)
  10. 一个事务复制的bug--更新丢失
  11. 软件缺陷分析的几种方法
  12. 搜狗拼音、QQ拼音输入法、2345拼音输入法、百度输入法 、手心输入法对比。(个人体会)...
  13. 女孩起名字:诗经中惊艳的女孩名字
  14. 微信 小程序 APP 渗透测试方案
  15. mysql 批量查询
  16. MoviePy - 中文文档4-MoviePy实战案例-重新构建15世纪舞蹈视频
  17. 电机控制中标幺的目的
  18. 苏宁易购商品详情 API
  19. 错误笔记:JavaWeb:请求的资源[/$%7BpageContext.request.contextPath%7D/login]不可用
  20. perl中DBD-oracle安装,perl DBD :: Oracle模块安装

热门文章

  1. 【Linux篇】第十六篇——生产者消费者模型
  2. SRPG游戏开发(五十三)第十一章 地图动作与地图事件 - 二 地图剧情(Map Plot)
  3. 新手如何利用电脑本地环境搭建网站(超详细)
  4. Scratch安装使用教程
  5. Mac电脑使用:下载安装SourceTree的步骤以及使用方法
  6. codeblocks配置glut
  7. 淘宝详情页分发推荐算法总结:用户即时兴趣强化
  8. CNAS发布最新实验室认可规则以及实验室管理体系准则
  9. 学习英文之社区,博客及源码
  10. matlab自动写word报告,matlab自动写入word