我是靠谱客的博主 奋斗白猫,最近开发中收集的这篇文章主要介绍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('nn')

看结果:

第一次循环
[[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)

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

最后

以上就是奋斗白猫为你收集整理的numpy.bincount介绍以及巧妙计算分类结果中每一类预测正确的个数的全部内容,希望文章能够帮你解决numpy.bincount介绍以及巧妙计算分类结果中每一类预测正确的个数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部