🎲 概率论基础 — 贝叶斯分类器实战

从不确定性中提取知识,用贝叶斯思维做决策

📖 概率论核心概念

概率论是数据分析与机器学习的数学基石。从频率学派到贝叶斯学派,从经典分布到条件概率,理解概率论是进入数据科学世界的第一步。

概率论知识体系: 基础概念 分布体系 贝叶斯推断 ──────── ──────── ────────── 样本空间 Ω 离散分布 先验概率 P(A) 事件 A ⊂ Ω ├ 二项分布 B(n,p) 似然 P(B|A) 概率 P(A) ├ 泊松分布 Po(λ) 后验 P(A|B) 条件概率 P(A|B) └ 几何分布 ───────────── 独立事件 连续分布 贝叶斯分类器 全概率公式 ├ 正态分布 N(μ,σ²) ├ 朴素贝叶斯 贝叶斯公式 ├ 均匀分布 U(a,b) ├ 高斯贝叶斯 └ 指数分布 Exp(λ) └ 贝叶斯网络

1. 概率的基本性质

0 ≤ P(A) ≤ 1   |   P(Ω) = 1   |   P(A∪B) = P(A) + P(B) − P(A∩B)

2. 条件概率与贝叶斯定理

条件概率 P(A|B) 表示在B已发生条件下A发生的概率。贝叶斯定理将条件概率"翻转":

P(A|B) = P(B|A) · P(A) / P(B)
贝叶斯定理四要素:
P(A) — 先验概率:事件A的先验信念
P(B|A) — 似然:A为真时观测到B的概率
P(B) — 证据:观测到B的总概率(全概率公式)
P(A|B) — 后验概率:观测到B后对A的更新信念

🔬 贝叶斯定理经典案例:疾病检测

某疾病患病率0.1%,检测准确率99%(敏感性和特异性均为99%)。检测阳性,真正患病的概率是多少?

疾病检测贝叶斯分析: 已知: P(病) = 0.001 (先验: 千分之一患病) P(阳|病) = 0.99 (似然: 患病时99%检出) P(阳|无病)= 0.05 (假阳率: 5%误报) 全概率公式: P(阳) = P(阳|病)×P(病) + P(阳|无病)×P(无病) = 0.99×0.001 + 0.05×0.999 = 0.00099 + 0.04995 = 0.05094 贝叶斯定理: P(病|阳) = P(阳|病) × P(病) / P(阳) = 0.99 × 0.001 / 0.05094 ≈ 0.0194 → 仅1.94%! 💡 即使检测"99%准确",阳性时真正有病的概率 只有1.94%!因为健康人基数远大于病人, 大量假阳性淹没了真阳性。
这就是基础率谬误(Base Rate Fallacy)——人们常忽略先验概率,高估检测结果的可信度。在低患病率场景下,即使是高精度检测也需二次确认!

📊 常见概率分布

分布类型参数PMF/PDF典型应用
伯努利离散pP(X=k)=p^k(1-p)^(1-k)抛硬币、二分类
二项离散n, pP(X=k)=C(n,k)p^k(1-p)^(n-k)n次实验成功次数
泊松离散λP(X=k)=λ^k·e^(-λ)/k!稀有事件计数
正态连续μ, σ²f(x)=(1/√2πσ)·e^(-(x-μ)²/2σ²)自然现象、中心极限
均匀连续a, bf(x)=1/(b-a)随机数生成
指数连续λf(x)=λe^(-λx)等待时间

分布代码验证

import numpy as np
from scipy import stats

# 正态分布 N(0,1)
print(f"正态分布 x=0 处PDF: {stats.norm.pdf(0):.4f}")  # 0.3989

# 二项分布 B(10, 0.3),k=3 的概率
print(f"二项分布 P(X=3): {stats.binom.pmf(3, 10, 0.3):.4f}")  # 0.2668

# 泊松分布 Poisson(2),k=3 的概率
print(f"泊松分布 P(X=3): {stats.poisson.pmf(3, 2):.4f}")  # 0.1804

# 中心极限定理验证
samples = [np.mean(np.random.uniform(0,1,30)) for _ in range(10000)]
print(f"均匀采样均值分布: μ={np.mean(samples):.3f}, σ={np.std(samples):.3f}")
# 理论: μ=0.5, σ=1/√(12×30)≈0.053

🤖 朴素贝叶斯分类器

朴素贝叶斯(Naive Bayes)是基于贝叶斯定理和特征条件独立假设的分类方法。虽然"朴素"地假设特征独立,但在很多场景下效果出奇地好。

P(y|X) ∝ P(y) · ∏P(xᵢ|y)

分类决策:ŷ = argmax_y P(y) · ∏P(xᵢ|y)

高斯朴素贝叶斯

当特征是连续变量时,假设每个特征在每个类别下服从高斯分布:

P(xᵢ|y) = (1/√2πσᵧ²) · exp(−(xᵢ−μᵧ)² / 2σᵧ²)
import numpy as np

# 生成3类2特征数据
np.random.seed(42)
centers = [(2, 3), (6, 7), (9, 3)]
X, y = [], []
for label, (cx, cy) in enumerate(centers):
    for _ in range(100):
        X.append([np.random.normal(cx, 0.8), np.random.normal(cy, 0.8)])
        y.append(label)
X, y = np.array(X), np.array(y)

# 高斯朴素贝叶斯
class GaussianNaiveBayes:
    def fit(self, X, y):
        self.classes = np.unique(y)
        self.means, self.vars, self.priors = {}, {}, {}
        for c in self.classes:
            X_c = X[y == c]
            self.means[c] = X_c.mean(axis=0)
            self.vars[c] = X_c.var(axis=0) + 1e-9  # 拉普拉斯平滑
            self.priors[c] = len(X_c) / len(X)

    def _gaussian_pdf(self, x, mean, var):
        return np.exp(-0.5 * ((x - mean)**2) / var) / np.sqrt(2*np.pi*var)

    def predict(self, X):
        preds = []
        for x in X:
            posteriors = {}
            for c in self.classes:
                prior = np.log(self.priors[c])
                likelihood = np.sum(
                    np.log(self._gaussian_pdf(x, self.means[c], self.vars[c]))
                )
                posteriors[c] = prior + likelihood
            preds.append(max(posteriors, key=posteriors.get))
        return np.array(preds)

# 训练与评估
split = int(0.7 * len(X))
model = GaussianNaiveBayes()
model.fit(X[:split], y[:split])
y_pred = model.predict(X[split:])
accuracy = np.mean(y_pred == y[split:])
print(f"贝叶斯分类器准确率: {accuracy:.4f}")  # 1.0000

🎯 全概率公式与边际概率

全概率公式将复杂事件分解为互斥的简单事件之和:

P(B) = Σᵢ P(B|Aᵢ) · P(Aᵢ)    其中 {Aᵢ} 是样本空间的划分
全概率公式的直觉理解:
想要知道"检测阳性"的总概率,不能只看病人,还要看健康人。
P(阳性) = P(阳性|病)×P(病) + P(阳性|健康)×P(健康)
这就是"全"概率——考虑所有可能的来源路径。

边际分布 vs 条件分布

概念符号含义关系
联合概率P(A,B)A和B同时发生P(A,B) = P(A|B)·P(B)
边际概率P(A)A发生的总概率P(A) = ΣᵦP(A,B=b)
条件概率P(A|B)B已发生时A的概率P(A|B) = P(A,B)/P(B)

🧮 期望、方差与协方差

E[X] = Σ xᵢ·P(xᵢ)   |   Var(X) = E[(X−μ)²]   |   Cov(X,Y) = E[(X−μx)(Y−μy)]
import numpy as np

# 蒙特卡洛估计π
np.random.seed(42)
n_samples = 100000
x = np.random.uniform(-1, 1, n_samples)
y = np.random.uniform(-1, 1, n_samples)
inside = (x**2 + y**2) <= 1
pi_estimate = 4 * inside.mean()
print(f"蒙特卡洛估计π: {pi_estimate:.4f}")  # ≈ 3.14

# 期望和方差的性质
print(f"E[aX+b] = aE[X]+b")
print(f"Var(aX+b) = a²Var(X)")
print(f"Var(X+Y) = Var(X)+Var(Y)+2Cov(X,Y)")

# 协方差矩阵
X = np.random.randn(100, 3)
cov = np.cov(X, rowvar=False)
print(f"协方差矩阵:\n{cov.round(3)}")

📐 2024-2025 概率论前沿应用

🏆 成就解锁:贝叶斯分类器正确率>85%
完成手写高斯朴素贝叶斯分类器,在3类2特征数据上达到 100% 准确率!
Python验证通过 — 贝叶斯分类器准确率: 1.0000,远超85%目标。贝叶斯定理演示:疾病检测阳性时患病概率仅1.94%,验证基础率谬误。正态/二项/泊松分布计算均与理论值一致。
思考题:
1. 如果疾病患病率从0.1%升至1%,阳性预测值会变成多少?
2. 朴素贝叶斯的"朴素"假设何时会严重失效?
3. 为什么对数空间计算可以避免下溢问题?
4. 拉普拉斯平滑(加1平滑)如何处理零概率问题?

📝 课后练习

  1. 实现多项式朴素贝叶斯,用于文本分类(垃圾邮件过滤)
  2. 用蒙特卡洛方法估计三维球体体积
  3. 实现贝叶斯更新:随着新观测逐步更新后验概率
  4. 比较高斯朴素贝叶斯与sklearn实现的性能差异
  5. 可视化不同先验对后验分布的影响
📚 参考资料:
• Pattern Recognition and Machine Learning (Bishop, 2006)
• Bayesian Data Analysis (Gelman et al., 2013)
• sklearn.naive_bayes 官方文档 (scikit-learn.org)
• Conformal Prediction: 2024 Survey (Angelopoulos et al.)