这个python规范化代码是如何工作的?

fruv7luv  于 2022-10-22  发布在  Python
关注(0)|答案(1)|浏览(121)
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

在学习图像识别的规范化过程中,我看到很多人使用此代码。我知道这句话是用来规范混淆矩阵的,这样它只包含0到1之间的数字。这样,正确分类样本的百分比就可以从矩阵中读取。我的数学不太好,但我想知道这个句子是如何运作的。如果有人能帮我,我会很感激的!

n53p2ov0

n53p2ov01#

它沿着一个轴(轴1)找到一个和,然后沿着该轴广播除以和的相应值。
所以假设你有:

>>> arr = np.arange(4*5).reshape(4, 5)
>>> arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

首先,它沿着轴求和:

>>> arr.sum(1)
array([10, 35, 60, 85])

注意,不能用当前形状广播这两个数组:

>>> arr / arr.sum(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (4,5) (4,)

尾随轴必须为1,因此您可以添加一个新轴,其结果形状为(4,1):

>>> arr.sum(1)[:, np.newaxis]
array([[10],
       [35],
       [60],
       [85]])
>>> arr.sum(1)[:, np.newaxis].shape
(4, 1)

现在,广播部门的工作是:

>>> arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> arr.sum(1)[:, np.newaxis]
array([[10],
       [35],
       [60],
       [85]])
>>> arr / arr.sum(1)[:, np.newaxis]
array([[0.        , 0.1       , 0.2       , 0.3       , 0.4       ],
       [0.14285714, 0.17142857, 0.2       , 0.22857143, 0.25714286],
       [0.16666667, 0.18333333, 0.2       , 0.21666667, 0.23333333],
       [0.17647059, 0.18823529, 0.2       , 0.21176471, 0.22352941]])

阅读有关broadcasting in the numpy docs的更多信息

相关问题