AI_概率统计-4.机器学习必备
涵盖先验/后验概率、熵、交叉熵、KL散度、置信区间与显著性,并补充手工计算示例、Python 代码示例及学习资料链接。
4. 机器学习必备
核心目标:掌握机器学习中高频核心概念(先验/后验概率、熵、交叉熵、KL散度),理解其数学含义与机器学习中的核心应用——尤其是交叉熵作为分类损失函数的本质、KL散度衡量分布差异的逻辑,同时了解置信区间、显著性的基础概念,为后续模型训练(如分类器、模型评估)奠定核心理论基础。
说明:知识点侧重“机器学习实战关联”,不深究复杂数学推导,重点掌握“概念含义”“公式应用”“机器学习场景”;手工计算示例选用简单案例,贴合分类任务、分布对比等高频场景;代码示例聚焦机器学习实际应用,可直接运行验证。
4.1 先验概率与后验概率
4.1.1 定义与公式
- 先验概率 P(\theta):在观测数据之前,对参数或类别的已有信念(主观或客观)。例如,在朴素贝叶斯中,类别的先验可设为训练集中各类别样本比例。
- 后验概率 P(\theta|X):观测到数据 X 之后,对参数或类别概率的更新。通过贝叶斯公式计算:
P(\theta|X) = \frac{P(X|\theta) P(\theta)}{P(X)}
其中 P(X|\theta) 是似然(给定参数下数据的概率),P(X) 是证据(全概率公式计算)。
关键区别:先验概率是“无观测数据时的概率”,后验概率是“有观测数据后的修正概率”。机器学习的核心是“通过观测数据(特征),将先验概率更新为后验概率,实现分类/预测”。
在 AI 中的应用:
- 朴素贝叶斯分类器:用先验 P(Y) 和似然 P(X|Y) 计算后验 P(Y|X),选择后验最大的类别。
- 贝叶斯优化:用高斯过程先验,根据观测数据更新后验,指导超参数搜索。
- 贝叶斯神经网络:对权重引入先验分布,训练得到后验分布,提供不确定性估计。
4.1.2 手工计算示例
例(朴素贝叶斯分类场景):训练集有100个样本,正类(Y=1)60个,负类(Y=0)40个;某样本具有特征 X,且 P(X|Y=1)=0.8,P(X|Y=0)=0.3。求先验概率 P(Y=1)、P(Y=0) 和后验概率 P(Y=1|X)。
解:
P(Y=1)=\frac{60}{100}=0.6,P(Y=0)=0.4。
P(X)=0.8\times0.6+0.3\times0.4=0.48+0.12=0.6。
P(Y=1|X)=\frac{0.8\times0.6}{0.6}=0.8。
解读:先验中正类占60%,观测到特征 X 后,正类后验概率提升至80%,朴素贝叶斯会将此样本判为正类。
4.1.3 Python 代码示例
import numpy as np
# 模拟二分类场景
labels = np.array([1,1,1,1,1,1,0,0,0,0]) # 6个正类,4个负类
features = np.array([1,1,1,0,1,1,0,0,1,0]) # 特征X=1/0
P_Y1 = np.mean(labels == 1)
P_Y0 = np.mean(labels == 0)
P_X1_Y1 = np.mean(features[labels == 1] == 1)
P_X1_Y0 = np.mean(features[labels == 0] == 1)
P_X1 = P_X1_Y1 * P_Y1 + P_X1_Y0 * P_Y0
P_Y1_X1 = (P_X1_Y1 * P_Y1) / P_X1
print(f"先验 P(Y=1)={P_Y1:.2f}, P(Y=0)={P_Y0:.2f}")
print(f"后验 P(Y=1|X=1)={P_Y1_X1:.2f}")
4.2 熵、交叉熵 —— 分类任务损失函数来源
4.2.1 熵(Entropy)
定义:衡量随机变量取值的不确定性。熵越大,不确定性越高;熵越小,不确定性越低(当随机变量只有一个确定取值时,熵为0)。
公式(离散型,机器学习高频使用):
H(P) = -\sum_{i} P(x_i) \log P(x_i)
(对数底可为 e 或 2,常用自然对数,单位为 nat;底为2时单位为 bit。AI中常用自然对数,不影响优化方向。)
机器学习应用:
- 衡量标签分布的不确定性(标签熵越大,类别越均衡,模型训练难度越高)。
- 作为交叉熵的组成部分,推导分类损失函数。
- 决策树的分裂依据(信息增益 = 父节点熵 - 子节点熵)。
4.2.2 交叉熵(Cross Entropy)—— 分类损失函数核心
定义:衡量两个概率分布 P(真实分布)和 Q(预测分布)之间的差异。
H(P,Q) = -\sum_{i} P(x_i) \log Q(x_i)
在分类任务中的作用:交叉熵损失函数(负对数似然)正是 H(P,Q)。最小化交叉熵等价于最小化 KL 散度,使 Q逼近 P。
常用形式:
- 二分类交叉熵损失:L = -[y \log \hat{y} + (1-y) \log(1-\hat{y})]
- 多分类交叉熵损失(结合 Softmax):L = -\sum_{i=1}^K y_i \log \hat{y}_i
为什么用交叉熵:梯度更稳定(相比均方误差),直接衡量预测分布与真实分布的差距。
4.2.3 手工计算示例
例1(熵):二分类标签均衡 P=[0.5,0.5],H = -0.5\log0.5 -0.5\log0.5 = \log2 \approx 0.693(自然对数)。若 P=[0.9,0.1],H \approx -0.9\log0.9 -0.1\log0.1 \approx 0.325。
例2(二分类交叉熵):真实标签 y=1,预测 \hat{y}=0.8,L = -\log0.8 \approx 0.223。
例3(多分类交叉熵):真实标签为第2类(one-hot [0,1,0]),模型输出 [0.2,0.7,0.1],L = -\log0.7 \approx 0.357。
4.2.4 Python 代码示例
import numpy as np
def entropy(p):
p = np.clip(p, 1e-10, 1)
return -np.sum(p * np.log(p))
def cross_entropy(p_true, p_pred):
p_pred = np.clip(p_pred, 1e-10, 1)
return -np.sum(p_true * np.log(p_pred))
# 熵示例
p_balance = [0.5, 0.5]
p_unbalance = [0.9, 0.1]
print(f"熵([0.5,0.5]) = {entropy(p_balance):.4f}")
print(f"熵([0.9,0.1]) = {entropy(p_unbalance):.4f}")
# 交叉熵示例
y_true_binary = np.array([1]) # 真实标签
y_pred_binary = np.array([0.8])
print(f"二分类交叉熵 = {cross_entropy(y_true_binary, y_pred_binary):.4f}")
y_true_multi = np.array([0,1,0])
y_pred_multi = np.array([0.2,0.7,0.1])
print(f"多分类交叉熵 = {cross_entropy(y_true_multi, y_pred_multi):.4f}")
4.3 KL 散度(Kullback-Leibler Divergence)—— 衡量两个分布差异
4.3.1 定义与公式
KL 散度(相对熵)衡量用分布 Q 近似 P 时损失的信息量。
D_{KL}(P \| Q) = \sum_i P(x_i) \log \frac{P(x_i)}{Q(x_i)} = H(P,Q) - H(P)
性质:
- D_{KL}(P\|Q) \ge 0,当且仅当 P=Q 时为零。
- 不对称性:D_{KL}(P\|Q) \neq D_{KL}(Q\|P)。
在 AI 中的应用:
- 变分自编码器(VAE):损失函数包含 KL 散度,迫使编码分布逼近标准正态分布。
- 知识蒸馏:学生网络输出与教师网络输出的 KL 散度作为蒸馏损失。
- 模型正则化:在损失函数中加入 KL 散度,约束预测分布贴近先验分布。
4.3.2 手工计算示例
例:真实分布 P=[0.5,0.5],预测分布 Q_1=[0.8,0.2],Q_2=[0.6,0.4]。
D_{KL}(P\|Q_1) = 0.5\log\frac{0.5}{0.8}+0.5\log\frac{0.5}{0.2} \approx 0.322
D_{KL}(P\|Q_2) = 0.5\log\frac{0.5}{0.6}+0.5\log\frac{0.5}{0.4} \approx 0.070
结论:Q_2 与 P 差异更小,更准确。
4.3.3 Python 代码示例
import numpy as np
def kl_divergence(p, q):
p = np.clip(p, 1e-10, 1)
q = np.clip(q, 1e-10, 1)
return np.sum(p * np.log(p / q))
P = [0.5, 0.5]
Q1 = [0.8, 0.2]
Q2 = [0.6, 0.4]
print(f"KL(P||Q1) = {kl_divergence(P, Q1):.4f}")
print(f"KL(P||Q2) = {kl_divergence(P, Q2):.4f}")
# 验证 KL = H(P,Q) - H(P)
H_P = entropy(P)
H_PQ1 = cross_entropy(P, Q1)
print(f"H(P,Q1)-H(P) = {H_PQ1:.4f} - {H_P:.4f} = {H_PQ1 - H_P:.4f}(等于KL)")
4.4 置信区间与显著性(了解概念即可)
4.4.1 基本概念
- 置信区间:以一定置信水平(如 95%)包含总体参数真值的区间。例如,模型准确率的 95% 置信区间为 [\hat{p} - z\cdot SE, \hat{p} + z\cdot SE]。区间越窄,估计越稳定。
- 显著性:假设检验中,p 值表示观察到的结果(或更极端)在零假设成立下出现的概率。通常 p < 0.05 认为结果显著,拒绝零假设。
在 AI 中的应用:
- 模型性能比较:计算两个模型准确率差异的置信区间,判断是否存在显著差异。
- 特征重要性判断:判断特征与标签的关联是否显著。
- 不确定性估计:模型预测的置信区间(如贝叶斯深度学习)。
4.4.2 手工计算示例
例:模型在 100 个测试样本上准确率为 85%,计算 95% 置信区间(近似正态,z_{0.025}=1.96)。
解:SE = \sqrt{\frac{0.85\times0.15}{100}} = 0.0357,区间 [0.85-1.96\times0.0357, 0.85+1.96\times0.0357] = [0.78, 0.92]。
4.4.3 Python 代码示例
import numpy as np
from scipy import stats
# 模拟10次测试准确率
acc_samples = np.array([0.85,0.88,0.86,0.87,0.89,0.84,0.87,0.88,0.86,0.87])
mean_acc = np.mean(acc_samples)
std_acc = np.std(acc_samples, ddof=1)
n = len(acc_samples)
t_val = stats.t.ppf(0.975, df=n-1)
ci = (mean_acc - t_val*std_acc/np.sqrt(n), mean_acc + t_val*std_acc/np.sqrt(n))
print(f"平均准确率: {mean_acc:.3f}, 95%置信区间: [{ci[0]:.3f}, {ci[1]:.3f}]")
4.5 综合代码实践
以下代码整合了上述所有概念,包含先验/后验、熵、交叉熵、KL散度计算及置信区间示例,可直接运行。
import numpy as np
from scipy import stats
# ---------- 1. 先验/后验 ----------
labels = np.array([1,1,1,1,1,1,0,0,0,0])
features = np.array([1,1,1,0,1,1,0,0,1,0])
P_Y1 = np.mean(labels==1)
P_Y0 = np.mean(labels==0)
P_X1_Y1 = np.mean(features[labels==1]==1)
P_X1_Y0 = np.mean(features[labels==0]==1)
P_X1 = P_X1_Y1*P_Y1 + P_X1_Y0*P_Y0
P_Y1_X1 = (P_X1_Y1*P_Y1)/P_X1
print(f"后验概率 P(Y=1|X=1) = {P_Y1_X1:.3f}")
# ---------- 2. 熵、交叉熵 ----------
def entropy(p):
p = np.clip(p, 1e-10, 1)
return -np.sum(p * np.log(p))
def cross_entropy(p_true, p_pred):
p_pred = np.clip(p_pred, 1e-10, 1)
return -np.sum(p_true * np.log(p_pred))
P = [0.5, 0.5]
Q = [0.8, 0.2]
print(f"熵 H(P) = {entropy(P):.4f}")
print(f"交叉熵 H(P,Q) = {cross_entropy(P, Q):.4f}")
# ---------- 3. KL散度 ----------
def kl(p, q):
p = np.clip(p, 1e-10, 1)
q = np.clip(q, 1e-10, 1)
return np.sum(p * np.log(p/q))
print(f"KL(P||Q) = {kl(P, Q):.4f}")
print(f"验证: H(P,Q)-H(P) = {cross_entropy(P, Q) - entropy(P):.4f}")
# ---------- 4. 置信区间 ----------
acc_samples = np.random.binomial(1, 0.85, 100) # 模拟100次预测
acc = np.mean(acc_samples)
se = np.sqrt(acc*(1-acc)/100)
z = stats.norm.ppf(0.975)
ci = (acc - z*se, acc + z*se)
print(f"准确率 {acc:.3f}, 95% CI: [{ci[0]:.3f}, {ci[1]:.3f}]")
4.6 学习资料链接
4.7 小结与学习建议
| 概念 | 核心公式 | 机器学习应用 | 重要性 |
|---|---|---|---|
| 先验/后验 | P(Y\|X)=\frac{P(X\|Y)P(Y)}{P(X)} | 朴素贝叶斯、贝叶斯优化 | ★★★★★ |
| 熵 | H(P)=-\sum P\log P | 不确定性度量、决策树 | ★★★★ |
| 交叉熵 | H(P,Q)=-\sum P\log Q | 分类损失函数 | ★★★★★ |
| KL 散度 | D_{KL}(P\|Q)=\sum P\log\frac{P}{Q} | VAE、知识蒸馏、正则化 | ★★★★ |
| 置信区间 | \bar{x} \pm z\cdot SE | 模型性能评估 | ★★ |
学习路径:
- 先理解贝叶斯公式与先验/后验的关系,手工计算小例子。
- 掌握熵和交叉熵的计算,理解为何交叉熵适合作为分类损失。
- 将 KL 散度与交叉熵、熵关联,并理解其在生成模型中的作用。
- 了解置信区间和显著性的基本含义,能解读模型评估结果。
注意:熵、交叉熵、KL 散度是信息论的核心,也是深度学习损失函数设计的理论源头。建议结合实际代码(如训练一个简单分类器)观察损失下降过程,加深理解。置信区间与显著性在模型评估与实验设计中有用,但入门阶段了解概念即可。
更多推荐
所有评论(0)