从不确定性中提取知识,用贝叶斯思维做决策
概率论是数据分析与机器学习的数学基石。从频率学派到贝叶斯学派,从经典分布到条件概率,理解概率论是进入数据科学世界的第一步。
条件概率 P(A|B) 表示在B已发生条件下A发生的概率。贝叶斯定理将条件概率"翻转":
P(A) — 先验概率:事件A的先验信念P(B|A) — 似然:A为真时观测到B的概率P(B) — 证据:观测到B的总概率(全概率公式)P(A|B) — 后验概率:观测到B后对A的更新信念
某疾病患病率0.1%,检测准确率99%(敏感性和特异性均为99%)。检测阳性,真正患病的概率是多少?
| 分布 | 类型 | 参数 | PMF/PDF | 典型应用 |
|---|---|---|---|---|
| 伯努利 | 离散 | p | P(X=k)=p^k(1-p)^(1-k) | 抛硬币、二分类 |
| 二项 | 离散 | n, p | P(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, b | f(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)是基于贝叶斯定理和特征条件独立假设的分类方法。虽然"朴素"地假设特征独立,但在很多场景下效果出奇地好。
分类决策:ŷ = argmax_y P(y) · ∏P(xᵢ|y)
当特征是连续变量时,假设每个特征在每个类别下服从高斯分布:
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(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) |
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)}")