已经是最新一篇文章了!
已经是最后一篇文章了!
贝叶斯定理、常见分布、假设检验
前言
概率统计是机器学习的另一大数学支柱。从朴素贝叶斯分类器到深度学习中的dropout,概率论的思想无处不在。本文将介绍机器学习中最重要的概率统计概念。
概率基础
基本概念
| 术语 | 定义 | 示例 |
|---|---|---|
| 样本空间 $\Omega$ | 所有可能结果的集合 | 掷骰子:{1,2,3,4,5,6} |
| 事件 $A$ | 样本空间的子集 | 掷出偶数:{2,4,6} |
| 概率 $P(A)$ | 事件发生的可能性 | $P(\text{偶数}) = 0.5$ |
概率公理
- 非负性:$P(A) \geq 0$
- 规范性:$P(\Omega) = 1$
- 可加性:互斥事件 $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}")
假设检验
基本流程
- 提出零假设 $H_0$ 和备择假设 $H_1$
- 选择显著性水平 $\alpha$(通常0.05)
- 计算检验统计量
- 根据 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 许可协议进行授权)
本文标题:《 机器学习基础系列——数学基础:概率统计 》
本文最后一次更新为 天前,文章中的某些内容可能已过时!