我正在使用“使用Python进行机器学习简介”一书中的Naive Bayes分类器示例,并且正在努力理解以下代码示例的机制:
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个零
鉴于代码输出,我的理解显然不正确。
答案 0 :(得分:2)
您可以从代码行的内部开始
X[y == label].sum(axis=0)
让我们看一下案例label==0
。然后
y == label
# results in
[ True False True False]
使用这个带有4个条目的布尔列表来索引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
本身的布尔数组并对其列求和。
counts[label] = (X == label).sum(axis=0)
使用此行运行代码将生成
# for label == 0
[2 3 2 1]
# for label == 1
[2 1 2 3]
答案 1 :(得分:0)
您似乎忘记了布尔掩码function getUserDetails (obj) {
return obj.Details;
}
_(getUserDetails(obj)).pick('userEmail', 'token');
。
有关Boolean or “mask” index arrays州的文档:
与整数索引数组的情况不同,在布尔情况下,结果是一个一维数组,其中包含索引数组中与布尔数组中所有真实元素对应的所有元素。
因此y == label
的{{1}}会导致:
X[y == label]
根据文件,是:
label = 0
垂直求和,你得到:
X[np.array(true, false, true, false)]
同一过程获得[[0 1 0 1]
[0 0 0 1]]
。这一次count[0] = np.array([0, 1, 0, 2])
,count[1]
给出label = 1
。使用此数组屏蔽y == label
会给出:
np.array(false, true, false, true)
垂直求和以获得:
X