两组标签映射之匈牙利法

在计算ACC时,真实标签和预测标签经常出现数据分类相同但是类别序号不同的情况,这时需要对两个标签进行映射,匈牙利法是一个很好的选择。

它是基于图论中的二分图匹配问题,主要步骤如下:

  1. 构建代价矩阵:首先,根据聚类结果和真实标签之间的对应关系,构建一个代价矩阵。这个矩阵的每一行代表一个聚类标签,每一列代表一个真实标签,矩阵中的每个元素代表相应聚类标签和真实标签之间的代价,通常这个代价是用两个标签不匹配的点的数量来衡量的。
  2. 应用匈牙利算法:然后,使用匈牙利算法来找到代价矩阵中的最小化总代价的匹配方案。这个过程实际上是在寻找一种最优的标签映射,使得聚类标签和真实标签之间的不匹配数量最小。
  3. 评价映射结果:最后,根据得到的标签映射结果,可以计算聚类的精度(如Accuracy)和标准互信息(NMI)等评价指标,以评估聚类的质量

其Python代码如下:

@author: lqh
"""
import numpy as np
def max_index(G, axis=0):
    return np.argmax(G, axis=axis)
def label_map(La1,La2):
    La1 = np.array(La1)
    La2 = np.array(La2)

    Label1 = np.unique(La1)
    L1 = len(Label1)
    Label2 = np.unique(La2)
    L2 = len(Label2)
#寻找重复标签矩阵
    G = np.zeros((max(L1, L2), max(L1, L2)))
    for i in range(L1):
        index1 = La1 == Label1[i]
        for j in range(L2):
            index2 = La2 == Label2[j]
            G[i, j] = np.sum(index1 * index2)

    NewLabel = np.zeros(len(La2)).reshape(-1,1)
    for i in range(L2):
        n = np.max(np.max(G))
        row, cell = np.where(G == n)
        NewLabel[La2 == Label2[cell[0]]] = Label1[row[0]]
        G[:, cell[0]] = 0
    return NewLabel


if __name__ == '__main__':
    l1 = [0,0,0,1,1,1,2,2,2,2,2,2,3,3,3,3,3]
    l2 = [1,1,1,4,2,2,2,2,4,4,4,4,5,5,5,5,1]
    La1 = np.array(l1)
    La2 = np.array(l2)
    l2 = label_map(La1,La2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值