WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
ml02 贝叶斯决策理论 — exercise.py 练习指南
练习目标
通过补全高斯对数似然、贝叶斯后验概率和最小风险决策三个模块,从代码层面掌握贝叶斯决策理论的核心计算。
预备知识
在开始练习前,确保你已经理解了以下概念:
- 多元高斯密度的对数形式:
- Log-Sum-Exp 技巧:
( m = max(x_i)),防止指数溢出 - 后验概率归一化:
- 条件风险:
任务清单
任务1:实现对数似然 compute_log_likelihood(X, mu, cov)
- 实现步骤:
- 用
np.linalg.pinv(cov)计算协方差矩阵的伪逆 - 用
np.linalg.slogdet(cov)计算协方差矩阵行列式的对数(注意返回值是(sign, logdet),取logdet) - 计算差值
diff = X - mu - 计算马氏距离平方:
mahal = np.sum((diff @ cov_inv) * diff, axis=1)(向量化批量运算) - 返回
-0.5 * (d * np.log(2*np.pi) + log_det + mahal)
- 用
- 关键细节:
np.linalg.pinvvsnp.linalg.inv——当协方差接近奇异时,伪逆给出稳定解
任务2:实现后验概率 compute_posteriors(log_likelihoods, priors)
- 实现步骤:
log_prior = np.log(priors)log_joint = log_likelihoods + log_prior(NumPy broadcasting:(n,C) + (C,) → (n,C))log_evidence = logsumexp(log_joint, axis=1, keepdims=True)log_posteriors = log_joint - log_evidence- 返回
np.exp(log_posteriors)
- 直觉:在对数空间中,乘法变加法(
),除法变减法( ),一切都变成了简单的加减运算
任务3:实现最小风险决策 minimum_risk_decision(posteriors, loss_matrix)
- 实现步骤:
- 初始化
risks = np.zeros((n_samples, n_classes)) - 双重循环:对每个行动
和每个真实类别 ,累加 - 返回
np.argmin(risks, axis=1)
- 初始化
- 关键测试:不对称损失矩阵应能改变决策结果——当将 "真
判为 " 的代价很高时,分类器倾向于判为
验证标准
运行 python exercise.py:
test_log_likelihood():2D 标准高斯在原点的对数似然应为test_posteriors():每行后验概率之和应为 1;似然差距大 + 先验大 → 后验更大test_risk_decision():对称损失下的决策应等价于最大后验;不对称损失应改变决策
源码位置
clone 后打开(相对仓库根目录):
docs/ml/classic/bayesian-decision/code/exercise.py