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

前言

概率统计是机器学习的另一大数学支柱。从朴素贝叶斯分类器到深度学习中的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(AB) = \frac{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 许可协议进行授权)

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

本文链接:https://www.sshipanoo.com/blog/ai/ml-basics/数学基础-概率统计/

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