【np.bincount】np.bincount()用在分割领域生成混淆矩阵

1 混淆矩阵定义

混淆矩阵:Confusion Matrix,用于直观展示每个类别的预测情况,能从中计算准确率(Accuracy)、精度(Precision)、召回率(Recall)、交并比(IoU)。

混淆矩阵是n*n的矩阵(n是类别),对角线上的是正确预测的数量。

每一行之和是该类的真实样本数量,每一列之和是预测为该类的样本数量。
混淆矩阵

2 np.bincount()函数解读

返回从0到 array中最大值 每个数出现的次数

np.bincount(array, minlength)
	minlength:限制返回列表的最小长度,不够用0

举例:

if __name__=='__main__':
    import numpy as np

    x = np.array([1,3,3,4,5,4,7])
    x_True_False1 = np.array([True,True,True,True,True,True,True])
    x1 = x[x_True_False2]	# [3 3 4 5 4 7]
    x_True_False2 = np.array([True,True,True,True,True,True,True])
    x = x[x_True_False2]
    print(x)                # [1 3 3 4 5 4 7]

    y = np.bincount(x)      # 返回从0到输入array中最大值 每个数出现的次数
    print(y)                # [0 1 0 2 2 1 0 1]
    z = np.bincount(x, minlength=9)     # minlength限制返回列表的最小长度,长度不够,0来凑
    print(z)                # [0 1 0 2 2 1 0 1 0]
    print(z.reshape(3,3))
    """
    [[0 1 0]
     [2 2 1]
     [0 1 0]]
    """

3 生成混淆矩阵

在这里,x和x_label的位置可以交换,但理解方式就不同了,要注意!

if __name__=='__main__':
    x = np.array([1,3,3,4,5,4,7])
    x_label = np.array([1,3,3,4,5,5,7])     # 假设有10类
    print(np.bincount(10*x.astype(int)+x_label, minlength=10**2).reshape(10,10))
    """
    [[0 0 0 0 0 0 0 0 0 0]
     [0 1 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 2 0 0 0 0 0 0]
     [0 0 0 0 1 1 0 0 0 0]
     [0 0 0 0 0 1 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 1 0 0]
     [0 0 0 0 0 0 0 0 0 0]
     [0 0 0 0 0 0 0 0 0 0]]
    """

假设n=10,有10类,
对于预测正确的像素来说,n * x + x_label就是对角线的值
很明显,非对角线上的那个就是预测错的,它把5预测成了4,为什么出现在那个位置:
10*4+5=45,出现在第5行第6列(注意索引和类别的关系!)

4 感谢链接

https://www.jianshu.com/p/42939bf83b8a
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值