[转载] numpy.bincount介绍以及巧妙计算分类结果中每一类预测正确的个数

参考链接: Python中的numpy.bincount

之前接触到bincount这个函数,简单的以为它就是计算分类结果中每一类的数量,如下: 

import numpy as np

a = np.array([0,1,3,2,1])

binc = np.bincount(a)

print(binc)

 

结果输出是这样: 

[1 2 1 1] 

这个结果表示0有1个,1有两个,2和3各有一个。 

但是今天又发现了一个不为人知的巧妙用法,是在一篇论文的源码中发现的。直接看代码 

#假设你总共要分3类,也可设为num_classes

prediction = np.array([0,1,1,2,0,1,2])

truth = np.array([0,1,2,2,0,1,1])

#上面两行假设是你的分类结果和真实分类

hist = np.zeros((3,3))#以类数为维数的矩阵

 

#定义一个函数,要注意label_pred和label_true都必须是np.array()

def _fast_hist(label_pred, label_true, num_classes):

 

    mask = (label_true >= 0) & (label_true < num_classes)

 

    hist = np.bincount(                                    #这是我们要学习的bincount函数

 

        num_classes * label_true[mask].astype(int) +

 

        label_pred[mask], minlength=num_classes ** 2).reshape(num_classes, num_classes)#minlength属性规定了bincount

                                                                                   函数返回的数组的最小长度,用0补齐

    #print(hist)

 

    return hist

#通过下面这个循环,可以计算出我们的分类情况

for lp,lt in zip(prediction,truth):

    hist += _fast_hist(lp.flatten(),lt.flatten(),3)    

    print(hist)

    print('\n\n') 

看结果: 

第一次循环

[[1. 0. 0.]

 [0. 0. 0.]

 [0. 0. 0.]]

 

第二次循环

 

[[1. 0. 0.]

 [0. 1. 0.]

 [0. 0. 0.]]

 

。。。

 

[[1. 0. 0.]

 [0. 1. 0.]

 [0. 1. 0.]]

 

 

 

[[1. 0. 0.]

 [0. 1. 0.]

 [0. 1. 1.]]

 

 

 

[[2. 0. 0.]

 [0. 1. 0.]

 [0. 1. 1.]]

 

 

 

[[2. 0. 0.]

 [0. 2. 0.]

 [0. 1. 1.]]

 

 

 

[[2. 0. 0.]

 [0. 2. 1.]

 [0. 1. 1.]]

 

 通过对比分类结果,可以看出,第一个和第二个的预测和事实都相等,计算出来的数值位于对角线,而当预测和事实不符时,数值落在别处。从_fast_hist函数中可以看到,利用num_classes,通过巧妙的计算,可以使预测正确的结果落在对角线。 

如果直接取对角线, 

iu = np.diag(hist) 

就能得到每一类分类正确的个数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值