BernoulliNB分类器代码工作原理解析及第5行逻辑疑问
Bernoulli Naive Bayes分类器代码逻辑解析
这段代码是伯努利朴素贝叶斯分类器中统计类别-特征出现次数的核心步骤,用来为后续计算条件概率做准备,以下是逐行拆解:
整体功能
针对数据集中的每个类别,统计该类别样本里每个二元特征(0/1取值)出现的总次数(因为伯努利模型的特征只有“出现(1)”和“不出现(0)”两种状态,求和等价于统计1的个数)。
逐行详解
counts = {}:创建一个空字典,用来存储「类别标签」对应「特征计数数组」的键值对。for label in np.unique(y)::遍历数据集中所有不重复的类别标签(np.unique(y)会自动去除y中的重复值,比如y是[0,1,0,1]时,会得到[0,1]两个类别)。counts[label] = X[y == label].sum(axis=0):这行是核心,拆解成三步理解:y == label:生成一个和y长度相同的布尔数组,数组中为True的位置,对应原数据中属于当前label类别的样本。X[y == label]:用上述布尔数组对特征矩阵X做行筛选,得到一个子矩阵——仅包含当前类别下的所有样本,行是样本,列是特征。.sum(axis=0):沿着列方向(axis=0代表按列聚合)求和。对每个特征列来说,把该类别所有样本的特征值(0或1)相加,结果就是这个特征在当前类别中出现的总次数。
直观示例
假设特征矩阵X和标签y如下:
X = np.array([[1,0,1], [0,1,1], [1,1,0], [0,0,1]]) y = np.array([0,1,0,1])
- 当
label=0时,y == 0得到[True, False, True, False],筛选X后得到子矩阵[[1,0,1],[1,1,0]],sum(axis=0)计算结果为[2,1,1]——意思是类别0中,第1个特征出现2次,第2个特征出现1次,第3个特征出现1次。 - 当
label=1时,筛选后的X子矩阵是[[0,1,1],[0,0,1]],求和结果为[0,1,2]——类别1中第1个特征出现0次,第2个出现1次,第3个出现2次。
这些计数结果是伯努利朴素贝叶斯计算条件概率的基础,后续会结合拉普拉斯平滑(避免概率为0)和类别样本总数,得到每个特征在对应类别下的出现概率。
内容的提问来源于stack exchange,提问作者Maedeh Rahimi
相关产品推荐
相关产品推荐

