我正在研究《Python 机器学习简介》一书中的朴素贝叶斯分类器示例,并且正在努力理解以下代码示例的机制:
import numpy as np
X = np.array([[0,1,0,1],
[1,0,1,1],
[0,0,0,1],
[1,0,1,0]])
y = np.array([0,1,0,1])
print(X)
print('\n')
print(y)
print('\n')
counts = {}
for label in np.unique(y):
print(label,'\n')
counts[label] = X[y == label].sum(axis=0)
print(counts[label],'\n')
print('Feature counts:\n{}'.format(counts))
代码输出:
[[0 1 0 1]
[1 0 1 1]
[0 0 0 1]
[1 0 1 0]]
[0 1 0 1]
0
[0 1 0 2]
1
[2 0 2 1]
Feature counts:
{0: array([0, 1, 0, 2]), 1: array([2, 0, 2, 1])}
我不明白每个类(0 和 1)的数组是如何填充的。
我的理解是 sum(axis=0) 意味着对矩阵的一列求和。因此,对于“0”标签(又名类),我在矩阵“X”中计算以下内容:
第一列有 2 个零,第二列有 3 个零,第三列有 2 个零,第四列有 1 个零
鉴于代码输出,我的理解显然不正确。
最佳答案
您可以从代码线的内部开始
X[y == label].sum(axis=0)
让我们看一下label==0
的情况。然后
y == label
# results in
[ True False True False]
使用这个包含 4 个条目的 bool 列表来索引 X
将因此选择 X 中的第一行和第三行,
[[0 1 0 1] # True[1 0 1 1]# False [0 0 0 1] # True[1 0 1 0]] # False
X[y == label]
#results in
[[0 1 0 1]
[0 0 0 1]]
现在你沿着这个 2x4 数组的列方向求和
X[y == label].sum(axis=0)
# results in
[0 1 0 2]
我在这里猜测,但您可能想要做的是创建一个 X
本身的 bool 数组,并对它的列求和。
counts[label] = (X == label).sum(axis=0)
使用此行运行代码将产生
# for label == 0
[2 3 2 1]
# for label == 1
[2 1 2 3]
关于python - 在 Numpy 中计算每个类的非零条目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47956549/