互信息和标准互信息


import math
import numpy as np
from sklearn import metrics
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 = [0.0206, 0.0277, 0.019, 0.0211, 0.0155, 0.0249, 0.0054, 0.0251, 0.0274, 0.0166, 0.0402, 0.0398, 0.0315, 0.0164, 0.0194, 0.0172, 0.022, 0.0429, 0.03, 0.0875, 0.0077, 0.0015, 0.0613, 0.0047, 0.0457, 0.0441, 0.0432, 0.0533, 0.0493, 0.0177, 0.0758, 0.0454]
    B = [0.0192, 0.0274, 0.0187, 0.0198, 0.0164, 0.0259, 0.0046, 0.0277, 0.0264, 0.0158, 0.0413, 0.0399, 0.0332, 0.0167, 0.0202, 0.0201, 0.0203, 0.0412, 0.0344, 0.0882, 0.0072, 0.0012, 0.0479, 0.0044, 0.0461, 0.0483, 0.0394, 0.0552, 0.0472, 0.017, 0.0776, 0.0509]
    result_NMI=metrics.normalized_mutual_info_score(A, B)
    print("result_NMI:",result_NMI)
    print(len(A))
    print(len(B))
    A = np.array([0.0206, 0.0277, 0.019, 0.0211, 0.0155, 0.0249, 0.0054, 0.0251, 0.0274, 0.0166, 0.0402, 0.0398, 0.0315, 0.0164,
         0.0194, 0.0172, 0.022, 0.0429, 0.03, 0.0875, 0.0077, 0.0015, 0.0613, 0.0047, 0.0457, 0.0441, 0.0432, 0.0533,
         0.0493, 0.0177, 0.0758, 0.0454])
    B =np.array([0.0192, 0.0274, 0.0187, 0.0198, 0.0164, 0.0259, 0.0046, 0.0277, 0.0264, 0.0158, 0.0413, 0.0399, 0.0332, 0.0167,
         0.0202, 0.0201, 0.0203, 0.0412, 0.0344, 0.0882, 0.0072, 0.0012, 0.0479, 0.0044, 0.0461, 0.0483, 0.0394, 0.0552,
         0.0472, 0.017, 0.0776, 0.0509])
    result_NMI =NMI(A, B)
    print("result_NMI:",result_NMI)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值