使用Numpy计算贝叶斯条件概率数组(无循环实现)
使用Numpy计算条件概率(无for循环)
条件概率 $P([x]_1=1 | Y=y)$ 的核心逻辑是:在Y等于y的样本集合中,统计$[x]_1$等于1的样本占比。我们可以通过Numpy的布尔索引直接筛选目标子集,再用np.mean或np.sum完成计算,完全不需要for循环。
实现代码
import numpy as np # 定义输入数组 x1 = np.array([1, 0, 1, 0, 1]) Y = np.array([1, 1, 1, 1, -1]) # 计算 P([x]₁=1 | Y=1) mask_y1 = Y == 1 p_x1_given_y1 = np.mean(x1[mask_y1] == 1) # 等价写法(用sum计算):np.sum(x1[mask_y1] == 1) / np.sum(mask_y1) # 计算 P([x]₁=1 | Y=-1) mask_y_neg1 = Y == -1 p_x1_given_y_neg1 = np.mean(x1[mask_y_neg1] == 1) # 等价写法:np.sum(x1[mask_y_neg1] == 1) / np.sum(mask_y_neg1) print(f"P([x]₁=1|Y=1) = {p_x1_given_y1}") print(f"P([x]₁=1|Y=-1) = {p_x1_given_y_neg1}")
代码解释
- 布尔掩码筛选:
Y == 1会生成一个布尔数组,标记所有Y取值为1的样本位置,同理Y == -1标记Y取值为-1的位置。 - 子集提取:
x1[mask_y1]会直接提取出Y=1对应的所有$[x]_1$值,得到数组[1, 0, 1, 0];x1[mask_y_neg1]提取出Y=-1对应的$[x]_1$值,得到数组[1]。 - 概率计算:
np.mean(x1[mask] == 1)会将布尔值(True/False)自动转为1/0,计算均值即得到1的占比,也就是条件概率。用np.sum的写法则是直接统计符合条件的样本数,再除以Y=y的总样本数,逻辑完全一致。
运行代码后会输出预期结果:
P([x]₁=1|Y=1) = 0.5 P([x]₁=1|Y=-1) = 1.0
内容的提问来源于stack exchange,提问作者ML NewBie
相关产品推荐
相关产品推荐

