WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
ml03 朴素贝叶斯与贝叶斯网络 — exercise.py 练习指南
练习目标
通过补全 GaussianNB 对数联合概率、MultinomialNB 特征概率估计和交叉验证选平滑参数三个模块,掌握朴素贝叶斯的核心计算。
预备知识
- 对数一维高斯密度:
- 条件独立下的联合对数似然:
- 带平滑的多项分布估计:
- 零概率的危害:若
,则
任务清单
任务1:实现 GaussianNB 的对数联合概率
- 步骤:
- 对每个类别
:计算 log_lik = -0.5 * (np.log(2*pi*var[j]) + (X - mean[j])**2 / var[j]) - 利用条件独立:
log_lik_sum = np.sum(log_lik, axis=1) - 加上先验:
log_joint[:, j] = log_lik_sum + np.log(priors[j])
- 对每个类别
- 关键细节:注意
(X - mu)的 shape 为(n, d),var的 shape 为(d,),NumPy 会自动 broadcasting
任务2:实现 MultinomialNB 的特征概率估计
- 步骤:
- 对每个类别,计算
count_c = np.sum(X_c, axis=0)(各特征的计数) - 计算
total = np.sum(count_c)(总计数) - 带平滑的概率:
prob = (count_c + alpha) / (total + alpha * n_features) - 存储对数概率:
feature_log_prob[j] = np.log(prob)
- 对每个类别,计算
- 为什么取对数:预测时用加法代替大量乘法,避免浮点下溢
任务3(Bonus):交叉验证选最佳 smooth 参数
- 步骤:
- 对每个候选
,做 K-Fold 交叉验证 - 用
np.setdiff1d排除验证集得到训练集 - 训练 MultinomialNB 并在验证集上计算准确率
- 选平均准确率最高的
- 对每个候选
验证标准
test_gaussian_nb():GaussianNB 在简单分类数据集上准确率 > 50%test_multinomial_nb():Laplace 平滑后所有特征概率 > 0(无-inf值)test_alpha_selection():交叉验证选择出有效的平滑参数
源码位置
clone 后打开(相对仓库根目录):
docs/ml/classic/naive-bayes/code/exercise.py