首页 > 编程语言 >标准化互信息NMI计算步骤及其Python实现

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

时间:2023-06-26 17:15:20浏览次数:63  
标签:1.0 Python 互信息 ids len np total NMI

假设对于17个样本点( v 1 , v 2 , . . . , v 17 ) 进行聚类:

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

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。

计算过程:略,有需要回原版看一下

代码实现过程:

  • 可以直接调用scikit-learn包中集成的度量函数
  • 自己编写函数实现计算过程
# -*- 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 = 0
    eps = 1.4e-45
    for 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])/total
            py = 1.0*len(idBOccur[0])/total
            pxy = 1.0*len(idABOccur)/total
            MI = MI + pxy*math.log(pxy/(px*py)+eps,2)
    # 标准化互信息
    Hx = 0
    for idA in A_ids:
        idAOccurCount = 1.0*len(np.where(A==idA)[0])
        Hx = Hx - (idAOccurCount/total)*math.log(idAOccurCount/total+eps,2)
    Hy = 0
    for 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 MIhat

if __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))  # 0.3645617718571898
    print(metrics.normalized_mutual_info_score(A,B))  # 0.36456177185718985

————————————————
版权声明:本文为CSDN博主「梦家」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/DreamHome_S/article/details/78379635

存在问题:如何获得标准聚类结果呢?

state:暂未解决

标签:1.0,Python,互信息,ids,len,np,total,NMI
From: https://www.cnblogs.com/shylkt/p/17506152.html

相关文章

  • Python中进行字符串拼接的常用方法!
    在Pyhon编程语言中,字符串拼接是一种十分常见的操作,通常用于将文本片段连接起来形成一段完整的字符串,然而很多人在进行字符串拼接操作时不可避免地会遇到一些错误,那么该如何解决呢?以下是详细的内容:1、使用"+"号进行字符串拼接在Python中,使用"+"号进行字符串拼接是最常......
  • 一杯咖啡的时间带你了解Python中的类
    1.定义类您可以使用class关键字在Python中定义一个类。下面是一个简单的类定义示例:classPerson:def__init__(self,name,age):self.name=nameself.age=agedefsay_hello(self):print("Hello,mynameis",self.name,"andIam",......
  • Python 实现将 Markdown 文档转换为 EPUB 电子书文件
    Python实现将Markdown文档转换为EPUB电子书文件已有转换工具要将Markdown文档转换为EPUB文件,可以使用一些工具和软件。以下是一些常见的方法:使用在线转换工具:有一些在线转换工具可以将Markdown文件转换为EPUB格式,如PandocOnline。只需要将Markdown文件上传......
  • Python如何将某文件夹下的文件名称输出到.txt文件中
    importos#os.listdir()方法获取文件夹名字,返回数组defgetAllFiles(targetDir):listFiles=os.listdir(targetDir)returnlistFilesfiles=getAllFiles(r"E:\UEtest\sla\精装\sla文件池\skp-10个")#写入list到txt文件中withopen(r"E:\UEtest\sla\精装\sla文件池\tes......
  • Python3 windows下 多环境管理
     windows下Python多环境隔离,每个项目拥有独立的依赖库,即site-packages。 ubuntu下通过 Anaconda 进行多环境操作, windows下往往直接下载安装包安装了(之前一直没去解决单个环境)现在整理下如下, 方式一(略,安装包有点大)1.官网下载Anaconda安装包下载地址:https://www......
  • Linux修改python源
    在运行pipinstallselenium或者安装其他三方库的时候遇到如下报错:Defaultingtouserinstallationbecausenormalsite-packagesisnotwriteableWARNING:pipisconfiguredwithlocationsthatrequireTLS/SSL,howeverthesslmoduleinPythonisnotavailable.Loo......
  • Python爬虫完整代码模版
    以下是一个基本的Python爬虫代码模板,可以根据需要进行修改:importrequestsfrombs4importBeautifulSoup#设置请求头,模拟浏览器访问headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110......
  • 您需要配置好的 Python 2 SDK 来渲染 Epydoc docstring
    今天给代码写注释,写完以后,鼠标放在方法上注释显示异常。我发现是因为我注释的格式不对。把@改成:后问题解决......
  • python下载与安装
    python下载与安装一、下载官网下载地址:https://www.python.org/downloads/二、安装1.为了避免自己配置环境变量,勾选添加至path2.直接下一步3.全选点击install4.在dos窗口中输入python,出现以下界面表示安装成功......
  • python版本的playwright如何使用代理
      fromplaywright.sync_apiimportPlaywright,sync_playwrightwithsync_playwright()asplaywright:browser=playwright.chromium.launch()proxy_server='http://my-proxy-server.com:8080'context=browser.new_context(proxy={......