贝叶斯定理、常见分布、假设检验

前言

概率统计是机器学习的另一大数学支柱。从朴素贝叶斯分类器到深度学习中的dropout,概率论的思想无处不在。本文将介绍机器学习中最重要的概率统计概念。


概率基础

基本概念

术语 定义 示例
样本空间 $\Omega$ 所有可能结果的集合 掷骰子:{1,2,3,4,5,6}
事件 $A$ 样本空间的子集 掷出偶数:{2,4,6}
概率 $P(A)$ 事件发生的可能性 $P(\text{偶数}) = 0.5$

概率公理

  1. 非负性:$P(A) \geq 0$
  2. 规范性:$P(\Omega) = 1$
  3. 可加性:互斥事件 $P(A \cup B) = P(A) + P(B)$

条件概率

\[P(A|B) = \frac{P(A \cap B)}{P(B)}\]
import numpy as np

# 示例:100个学生,60个喜欢数学,40个喜欢编程,20个两者都喜欢
# P(编程|数学) = P(编程∩数学) / P(数学)

p_math = 0.6
p_coding = 0.4
p_both = 0.2

p_coding_given_math = p_both / p_math
print(f"P(编程|数学) = {p_coding_given_math:.2f}")  # 0.33

贝叶斯定理

公式推导

\[P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}\]

各项含义:

  • $P(A B)$:后验概率 - 观察到B后,A的概率
  • $P(B A)$:似然 - A发生时,B的概率
  • $P(A)$:先验概率 - A的初始概率
  • $P(B)$:边缘概率 - B的总概率

实际应用:垃圾邮件分类

# 先验概率
p_spam = 0.3  # 30%的邮件是垃圾邮件
p_ham = 0.7   # 70%的邮件是正常邮件

# 似然:包含"免费"这个词的概率
p_free_given_spam = 0.8   # 垃圾邮件中80%包含"免费"
p_free_given_ham = 0.1    # 正常邮件中10%包含"免费"

# 边缘概率
p_free = p_free_given_spam * p_spam + p_free_given_ham * p_ham

# 后验概率:包含"免费"的邮件是垃圾邮件的概率
p_spam_given_free = (p_free_given_spam * p_spam) / p_free
print(f"P(垃圾|免费) = {p_spam_given_free:.2f}")  # 0.77

贝叶斯更新

def bayesian_update(prior, likelihood, evidence):
    """贝叶斯更新"""
    return (likelihood * prior) / evidence

# 初始先验
prior = 0.5

# 观察到多个证据后逐步更新
evidences = [
    (0.9, 0.2),  # (P(E|H), P(E|¬H))
    (0.7, 0.3),
    (0.8, 0.1),
]

for p_e_h, p_e_not_h in evidences:
    evidence = p_e_h * prior + p_e_not_h * (1 - prior)
    prior = bayesian_update(prior, p_e_h, evidence)
    print(f"更新后的后验概率: {prior:.4f}")

常见概率分布

离散分布

伯努利分布:单次试验,成功概率为 $p$

\[P(X=k) = p^k(1-p)^{1-k}, \quad k \in \{0, 1\}\]

二项分布:$n$ 次独立试验中成功 $k$ 次

\[P(X=k) = \binom{n}{k}p^k(1-p)^{n-k}\]
from scipy import stats
import matplotlib.pyplot as plt

# 二项分布
n, p = 10, 0.3
x = np.arange(0, n+1)
pmf = stats.binom.pmf(x, n, p)

plt.bar(x, pmf)
plt.xlabel('成功次数')
plt.ylabel('概率')
plt.title(f'二项分布 B({n}, {p})')
plt.show()

泊松分布:单位时间内事件发生次数

\[P(X=k) = \frac{\lambda^k e^{-\lambda}}{k!}\]

连续分布

正态分布(高斯分布)

\[f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\]
# 正态分布
mu, sigma = 0, 1
x = np.linspace(-4, 4, 100)
pdf = stats.norm.pdf(x, mu, sigma)

plt.plot(x, pdf)
plt.fill_between(x, pdf, alpha=0.3)
plt.xlabel('x')
plt.ylabel('概率密度')
plt.title(f'正态分布 N({mu}, {sigma}²)')
plt.show()

指数分布:事件间隔时间

\[f(x) = \lambda e^{-\lambda x}, \quad x \geq 0\]

分布对比

分布 类型 参数 期望 方差 应用
伯努利 离散 $p$ $p$ $p(1-p)$ 二分类
二项 离散 $n, p$ $np$ $np(1-p)$ 多次试验
泊松 离散 $\lambda$ $\lambda$ $\lambda$ 计数数据
正态 连续 $\mu, \sigma$ $\mu$ $\sigma^2$ 自然现象
指数 连续 $\lambda$ $1/\lambda$ $1/\lambda^2$ 等待时间

期望与方差

期望

离散:$E[X] = \sum_x x \cdot P(X=x)$

连续:$E[X] = \int_{-\infty}^{\infty} x \cdot f(x) dx$

# 计算期望
data = np.array([1, 2, 3, 4, 5])
weights = np.array([0.1, 0.2, 0.3, 0.25, 0.15])

expected_value = np.sum(data * weights)
print(f"期望: {expected_value}")

# NumPy 简化
print(f"均值: {np.mean(data)}")

方差与标准差

\[Var(X) = E[(X - \mu)^2] = E[X^2] - (E[X])^2\] \[\sigma = \sqrt{Var(X)}\]
data = np.array([2, 4, 4, 4, 5, 5, 7, 9])

variance = np.var(data)           # 总体方差
sample_variance = np.var(data, ddof=1)  # 样本方差
std_dev = np.std(data)

print(f"方差: {variance:.2f}")
print(f"样本方差: {sample_variance:.2f}")
print(f"标准差: {std_dev:.2f}")

协方差与相关系数

\[Cov(X, Y) = E[(X - \mu_X)(Y - \mu_Y)]\] \[\rho_{XY} = \frac{Cov(X, Y)}{\sigma_X \sigma_Y}\]
X = np.array([1, 2, 3, 4, 5])
Y = np.array([2, 4, 5, 4, 5])

# 协方差
covariance = np.cov(X, Y)[0, 1]
print(f"协方差: {covariance:.2f}")

# 相关系数
correlation = np.corrcoef(X, Y)[0, 1]
print(f"相关系数: {correlation:.2f}")

最大似然估计(MLE)

原理

给定观测数据,找到使数据出现概率最大的参数:

\[\hat{\theta}_{MLE} = \arg\max_\theta P(D|\theta) = \arg\max_\theta \prod_i P(x_i|\theta)\]

通常取对数简化计算:

\[\hat{\theta}_{MLE} = \arg\max_\theta \sum_i \log P(x_i|\theta)\]

示例:估计正态分布参数

# 生成数据
true_mu, true_sigma = 5, 2
data = np.random.normal(true_mu, true_sigma, 1000)

# MLE 估计
mu_mle = np.mean(data)
sigma_mle = np.std(data)

print(f"真实参数: μ={true_mu}, σ={true_sigma}")
print(f"MLE估计: μ={mu_mle:.2f}, σ={sigma_mle:.2f}")

使用 scipy 进行 MLE

from scipy.optimize import minimize

def neg_log_likelihood(params, data):
    mu, sigma = params
    if sigma <= 0:
        return np.inf
    return -np.sum(stats.norm.logpdf(data, mu, sigma))

# 优化
result = minimize(neg_log_likelihood, x0=[0, 1], args=(data,))
print(f"MLE估计: μ={result.x[0]:.2f}, σ={result.x[1]:.2f}")

假设检验

基本流程

  1. 提出零假设 $H_0$ 和备择假设 $H_1$
  2. 选择显著性水平 $\alpha$(通常0.05)
  3. 计算检验统计量
  4. 根据 p 值做出决策

t 检验

# 单样本 t 检验:检验均值是否等于某值
data = np.random.normal(5.2, 1.5, 100)
t_stat, p_value = stats.ttest_1samp(data, popmean=5)
print(f"t统计量: {t_stat:.2f}, p值: {p_value:.4f}")

# 双样本 t 检验:比较两组均值
group1 = np.random.normal(10, 2, 50)
group2 = np.random.normal(11, 2, 50)
t_stat, p_value = stats.ttest_ind(group1, group2)
print(f"t统计量: {t_stat:.2f}, p值: {p_value:.4f}")

卡方检验

# 卡方独立性检验
observed = np.array([[30, 10], [20, 40]])
chi2, p_value, dof, expected = stats.chi2_contingency(observed)
print(f"卡方统计量: {chi2:.2f}, p值: {p_value:.4f}")

在机器学习中的应用

朴素贝叶斯分类器

from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.3, random_state=42
)

# 训练
clf = GaussianNB()
clf.fit(X_train, y_train)

# 预测概率
proba = clf.predict_proba(X_test[:3])
print(f"预测概率:\n{proba}")

交叉熵损失

\[H(p, q) = -\sum_x p(x) \log q(x)\]
def cross_entropy(y_true, y_pred):
    """计算交叉熵损失"""
    epsilon = 1e-15
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

y_true = np.array([1, 0, 1, 1, 0])
y_pred = np.array([0.9, 0.1, 0.8, 0.7, 0.2])

loss = cross_entropy(y_true, y_pred)
print(f"交叉熵损失: {loss:.4f}")

常见问题

Q1: 频率派和贝叶斯派有什么区别?

  • 频率派:参数是固定的,通过大量重复实验估计
  • 贝叶斯派:参数是随机变量,通过先验和观测数据更新后验

Q2: p值 < 0.05 就一定有意义吗?

不一定。p值只说明”如果零假设为真,观察到这种极端结果的概率”。还需要考虑:

  • 效应量(effect size)
  • 样本量
  • 实际意义

Q3: 为什么深度学习常用交叉熵而不是MSE?

  • 交叉熵的梯度更稳定,不会出现梯度消失
  • 与 softmax 配合时有更简洁的梯度形式
  • 信息论解释更自然

Q4: 协方差和相关系数有什么区别?

  • 协方差受变量尺度影响,相关系数归一化到 [-1, 1]
  • 相关系数便于比较不同变量对之间的关系强度

总结

概念 公式 ML应用    
贝叶斯定理 $P(A B) = \frac{P(B A)P(A)}{P(B)}$ 朴素贝叶斯
正态分布 $N(\mu, \sigma^2)$ 权重初始化    
最大似然 $\arg\max \prod P(x_i \theta)$ 参数估计  
交叉熵 $-\sum p \log q$ 分类损失    

参考资料

  • 《统计学习方法》李航
  • 《Pattern Recognition and Machine Learning》Bishop
  • Khan Academy 概率统计课程

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:《 机器学习基础系列——数学基础:概率统计 》

本文链接:http://localhost:3015/ai/%E6%95%B0%E5%AD%A6%E5%9F%BA%E7%A1%80-%E6%A6%82%E7%8E%87%E7%BB%9F%E8%AE%A1.html

本文最后一次更新为 天前,文章中的某些内容可能已过时!