共计 3020 个字符,预计需要花费 8 分钟才能阅读完成。
背景介绍
Christopher Bishop 的《模式识别与机器学习》(Pattern Recognition and Machine Learning, PRML)是机器学习领域的奠基性教材之一。该书系统性地介绍了概率图模型、核方法、贝叶斯推理等核心理论,为现代机器学习算法提供了严谨的数学基础。PRML 的特色在于:

- 概率视角的统一框架:将监督学习、无监督学习等问题统一到概率建模的范式下
- 实践与理论平衡:每个算法都配有详细的数学推导和实现考量
- 工程友好性:包含大量算法实现的实用建议,如 EM 算法的收敛条件设置
核心算法解析
1. EM 算法(Expectation-Maximization)
用于含隐变量模型的参数估计,迭代过程分为:
- E 步骤:计算隐变量的后验期望
$$Q(\theta,\theta^{old})=\mathbb{E}_{Z|X,\theta^{old}}[\ln p(X,Z|\theta)]$$ - M 步骤:最大化 Q 函数更新参数
$$\theta^{new}=\arg\max_\theta Q(\theta,\theta^{old})$$
2. 核方法(Kernel Methods)
通过核函数隐式映射到高维空间,关键公式:
$$k(x,x’)=\phi(x)^T\phi(x’)$$
常用高斯核实现非线性分类:
$$k(x,x’)=\exp\left(-\frac{|x-x’|^2}{2\sigma^2}\right)$$
3. 贝叶斯网络(Bayesian Networks)
用有向无环图表示变量间的条件依赖,联合概率分解为:
$$p(X)=\prod_{i=1}^D p(x_i|\text{pa}_i)$$
其中 $\text{pa}_i$ 表示节点 $i$ 的父节点集合
工程实现
EM 算法实现(Python 3.8+)
import numpy as np
from scipy.stats import multivariate_normal
def em_gmm(X, n_components, max_iter=100, tol=1e-6):
"""
EM 算法实现高斯混合模型
参数:X : ndarray (n_samples, n_features)
n_components : int 高斯组件数量
max_iter : int 最大迭代次数
tol : float 收敛阈值
返回:weights : ndarray (n_components,)
means : ndarray (n_components, n_features)
covariances : list of ndarray 协方差矩阵
"""
n_samples, n_features = X.shape
# 初始化参数
weights = np.ones(n_components) / n_components
means = X[np.random.choice(n_samples, n_components, replace=False)]
covariances = [np.eye(n_features) for _ in range(n_components)]
for _ in range(max_iter):
# E-step
responsibilities = np.zeros((n_samples, n_components))
for k in range(n_components):
responsibilities[:, k] = weights[k] * \
multivariate_normal.pdf(X, means[k], covariances[k])
responsibilities /= responsibilities.sum(axis=1, keepdims=True)
# M-step
Nk = responsibilities.sum(axis=0)
weights = Nk / n_samples
means = (responsibilities.T @ X) / Nk[:, None]
for k in range(n_components):
diff = X - means[k]
covariances[k] = (responsibilities[:, k, None, None] * \
np.einsum('ij,ik->ijk', diff, diff)).sum(axis=0) / Nk[k]
return weights, means, covariances
核方法实现(使用 scikit-learn 兼容 API)
from scipy.spatial.distance import cdist
class KernelPCA:
def __init__(self, n_components=2, kernel='rbf', gamma=1.0):
self.n_components = n_components
self.kernel = kernel
self.gamma = gamma
def _rbf_kernel(self, X, Y=None):
if Y is None:
Y = X
return np.exp(-self.gamma * cdist(X, Y, 'sqeuclidean'))
def fit_transform(self, X):
K = self._rbf_kernel(X)
N = K.shape[0]
one_n = np.ones((N,N)) / N
K_centered = K - one_n.dot(K) - K.dot(one_n) + one_n.dot(K).dot(one_n)
eigvals, eigvecs = np.linalg.eigh(K_centered)
idx = np.argsort(eigvals)[::-1][:self.n_components]
components = eigvecs[:, idx] * np.sqrt(eigvals[idx])
return components
生产实践
算法选择决策树
graph TD
A[数据是否带标签?] -->| 是 | B[样本量 >10K?]
A -->| 否 | C[尝试 GMM/ 聚类]
B -->| 是 | D[特征是否线性可分?]
B -->| 否 | E[使用 SVM/ 核方法]
D -->| 是 | F[逻辑回归 / 线性模型]
D -->| 否 | G[神经网络 / 集成方法]
超参数调优指南
- EM 算法:
- 组件数量:通过 BIC 准则选择
$$\text{BIC} = -2\ln L + k\ln n$$ - 收敛阈值:通常设为 1e- 6 到 1e-4
- 核方法:
- 高斯核带宽 $\sigma$:网格搜索 log 空间(0.1, 10)
- 正则化参数:5 折交叉验证选择
- 贝叶斯网络:
- 先验强度:采用无信息先验避免过拟合
- 结构学习:使用 BDeu 评分函数
性能优化
计算复杂度分析
| 算法 | 时间复杂度 | 空间复杂度 | 可并行化 |
|---|---|---|---|
| EM | O(knTd^2) | O(kd^2 + nk) | E-step 可并行 |
| 核方法 | O(n^3) | O(n^2) | 矩阵分块计算 |
| 贝叶斯网 | O(m2^d) | O(2^d) | 节点条件独立 |
优化建议:
1. 对大规模数据使用随机变分推断(SVI)
2. 核矩阵近似:Nyström 方法或随机傅里叶特征
3. 利用 GPU 加速矩阵运算(如 CuPy 库)
延伸思考
PRML 对深度学习的启示:
1. 概率深度学习 :变分自编码器(VAE) 本质是 EM 算法的神经网络实现
2. 核深度化 :深度核学习(DKL) 结合了深度特征提取与核方法
3. 贝叶斯神经网络:将权重不确定性引入深度学习
推荐阅读
- 原始论文:
- Dempster et al. (1977) EM 算法奠基论文
- Vapnik (1995) 统计学习理论
- 开源项目:
- PyMC3:概率编程库
- GPy:高斯过程实现
- pgmpy:概率图模型工具包
正文完
发表至: 未分类
近两天内
