机器学习
统计学习与监督学习概论
统计学习的分类
基本分类
监督学习
实验样本 -> 模型 -> 预测结果 学习:训练样本 -> 模型
无监督学习
什么是无监督学习
无监督学习是机器学习的一种方法,不依赖标注数据,直接从无标签数据中学习数据的内在结构或模式。常见任务包括聚类、降维、异常检测和关联规则挖掘。
- 弱监督学习
- 强化学习
按算法分类
在线学习:一个一个。随机梯度下降、强化学习 批量学习:一次接受所有的数据
按技巧分类
贝叶斯学习
朴素贝叶斯、潜在狄利克雷分配
统计学习方法三要素
- 模型
- 策略
- 损失函数
- 风险函数
- 算法
模型评估与模型选择
- 训练
模型验证方法
正则化
用于惩罚模型的复杂度
可能是 L2 范数,也可能是 L1 范数
交叉验证
把模型分割成训练、验证、测试集
- 简单交叉验证
- k fold
- 留一交叉验证 k = n
泛化能力
泛化误差
生成模型与判别模型
判别模型
K 近邻法
监督学习应用
分类
TP, FP TN, FN 精确率 召回率 \(R = \frac{TP}{TP + FN}\) F1
标注
词性标注
信息抽取
回归
感知机
感知机模型
感知机模型是一种二分类线性分类模型,其输入为实例的特征向量,输出为实例的类别(通常取+1和-1)。模型定义为:
其中:
- \(w\) 为权值向量,\(b\) 为偏置;
- \(\text{sign}\) 是符号函数,当 \(w \cdot x + b \geq 0\) 时输出+1,否则输出-1。
感知机对应于特征空间中的一个分离超平面 \(w \cdot x + b = 0\),通过误分类驱动的学习策略(如随机梯度下降)调整参数,使超平面能够将正负样本完全分开。
k 近邻
什么是 k 近邻
k 近邻(k-NN)是一种基于实例的监督学习算法,主要用于分类和回归。其核心思想是:对于新样本,在训练集中找到与之最相似的 k 个近邻,通过投票(分类)或均值(回归)预测结果。
关键特点:
- 懒惰学习:训练阶段仅存储数据,预测时进行计算
- 距离度量:常用欧氏距离、曼哈顿距离等
- k 值选择:影响模型偏差-方差权衡(k 小则敏感,k 大则平滑)
- 无显式模型:直接依赖数据分布,无需参数训练
适用于小规模、低维数据,但对噪声和维度敏感。
Python 实现
以下是 k 近邻算法的 Python 实现:
import numpy as np
from collections import Counter
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
self.X_train = X
self.y_train = y
def predict(self, X):
predictions = [self._predict(x) for x in X]
return np.array(predictions)
def _predict(self, x):
# 计算所有训练样本的距离
distances = [np.linalg.norm(x - x_train) for x_train in self.X_train]
# 获取最近的 k 个样本的索引
k_indices = np.argsort(distances)[:self.k]
# 获取对应的标签
k_nearest_labels = [self.y_train[i] for i in k_indices]
# 多数投票
most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
# 示例使用
if __name__ == "__main__":
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练和预测
knn = KNN(k=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)
print(f"准确率: {accuracy_score(y_test, predictions):.2f}")
/关键点/:
fit()仅存储数据predict()Counter实现多数投票
也可直接使用 =sklearn.neighbors.KNeighborsClassifier=。
聚类算法
什么是聚类
聚类是一种无监督学习方法,旨在将数据集中的样本划分为若干组(簇),使得同一簇内的样本相似度高,不同簇间的样本相似度低。常用于数据探索、模式发现、降维等任务。
K-means
朴素贝叶斯
决策树
决策树与学习
决策树模型
决策树是一种基于树结构的分类与回归模型,通过一系列规则对数据进行划分。每个内部节点表示一个特征测试,每个分支代表测试结果,每个叶节点表示一个类别或回归值。
/核心思想/:递归地选择最优特征进行数据划分,直到满足停止条件(如节点纯度足够高或样本数过少)。
优势
- 显式表示因子:清晰地展示函数分解结构
- 统一框架:可以表示有向和无向图模型
- 高效推断:支持消息传递算法
- 模块化:便于理解和实现复杂模型
因子图为概率图模型提供了一个强大而直观的表示工具,特别适合处理具有复杂依赖关系的问题。
决策树学习
决策树学习旨在构建一棵与训练数据拟合良好且泛化能力强的树。主要包括三个步骤:
- /特征选择/:选择最优划分特征,常用准则包括信息增益、信息增益比、基尼指数等。
- /决策树生成/:递归地构建树结构,直至满足停止条件。
- /决策树剪枝/:防止过拟合,提升模型泛化能力。
因子图
因子图与Sum-Product算法 - 知乎 因子图是一种用于表示多变量函数因子分解的无向二分图。它在概率图模型(如贝叶斯网络、马尔可夫随机场)和状态估计问题(如SLAM、通信解码)中广泛应用。
基本结构
因子图包含两类节点:
- 变量节点:表示随机变量或未知参数
- 因子节点:表示变量之间的约束或函数关系
边只连接变量节点和因子节点,形成二分图结构。
数学表示
考虑一个多变量函数:
- \( S_j \subseteq \{x_1, x_2, \dots, x_n\} \) 是第 \( j \) 个因子函数 \( f_j \) 的作用域
- 每个 \( f_j \) 对应因子图中的一个因子节点
示例
考虑函数:
对应的因子图结构为:
- 变量节点:\( x_1, x_2, x_3, x_4, x_5 \)
- 因子节点:\( f_A, f_B, f_C, f_D, f_E \)
- 边连接:\( f_A-x_1, f_B-x_2, f_C-x_1, f_C-x_2, f_C-x_3, f_D-x_3, f_D-x_4, f_E-x_3, f_E-x_5 \)
使用 dotfile 画一个示例
以下是用 Graphviz dot 语言绘制的因子图示例:
/图例说明/:
- 圆形节点(蓝色):变量节点 \( x_1, x_2, x_3, x_4, x_5 \)
- 方形节点(橙色):因子节点 \( f_A, f_B, f_C, f_D, f_E \)
- 边:表示变量与因子之间的依赖关系
该图清晰地展示了函数 \( g(x_1, x_2, x_3, x_4, x_5) = f_A(x_1)f_B(x_2)f_C(x_1, x_2, x_3)f_D(x_3, x_4)f_E(x_3, x_5) \) 的因子分解结构。
在概率推断中的应用
在概率模型中,因子图常用于表示联合概率分布的因子分解。例如,对于联合分布:
和积算法
因子图上的主要推断算法是和积算法(Sum-Product Algorithm),用于计算边际分布:
- 从变量节点到因子节点的消息:
- 从因子节点到变量节点的消息:
其中 \( \mathcal{N}(\cdot) \) 表示邻居节点集合。
import numpy as np
class FactorGraph:
"""简单的因子图实现示例"""
def __init__(self):
self.variable_nodes = {}
self.factor_nodes = {}
self.edges = []
def add_variable(self, name, domain):
"""添加变量节点"""
self.variable_nodes[name] = {'domain': domain, 'neighbors': []}
def add_factor(self, name, variables, potential_func):
"""添加因子节点"""
self.factor_nodes[name] = {
'variables': variables,
'potential': potential_func,
'neighbors': []
}
# 添加边
for var in variables:
self.edges.append((f'f_{name}', f'v_{var}'))
self.variable_nodes[var]['neighbors'].append(f'f_{name}')
self.factor_nodes[name]['neighbors'].append(f'v_{var}')
def belief_propagation(self, variable, evidence=None):
"""简化的信念传播示例"""
if evidence is None:
evidence = {}
# 这里实现简化的消息传递
messages = {}
# 初始化消息
for var in self.variable_nodes:
messages[f'v_{var}'] = np.ones(len(self.variable_nodes[var]['domain']))
# 应用证据
for var, value in evidence.items():
if var in self.variable_nodes:
domain = self.variable_nodes[var]['domain']
idx = domain.index(value)
msg = np.zeros(len(domain))
msg[idx] = 1.0
messages[f'v_{var}'] = msg
return messages
# 示例用法
fg = FactorGraph()
fg.add_variable('x1', [0, 1])
fg.add_variable('x2', [0, 1])
fg.add_factor('A', ['x1', 'x2'], lambda x,y: np.exp(-(x-y)**2))
print("变量节点:", fg.variable_nodes)
print("因子节点:", fg.factor_nodes)
print("边:", fg.edges)
Sum-Product 算法
Sum-Product(x){
if(x是变量节点){
if(x为叶子节点)
return 1;
subFx = {x的子节点(全为因子节点)};
result = 1;
for(x_i in subFx){
result = result * Sum-Product(x_i);
}
return result ;
}
if(x是因子节点) {
if(x是叶子节点)
return f(xp);//f为x表示的因子,xp为x的父节点
subVx = {x的子节点(全为变量节点)};
result = 1;
for(x_i in subFx){
result = Sum-Product(x_i);
}
return marginal(xC,f(xp,xC)*result)
//f为x表示的因子,xC为x的子节点集合,xp为x父节点
//marginal()为对f关于xC求边缘概率
}
}
信息增益(ID3算法)
设训练集 \(D\) 有 \(K\) 个类别,样本属于第 \(k\) 类的概率为 \(p_k\),则 \(D\) 的经验熵为:
给定特征 \(A\) 有 \(n\) 个取值,将 \(D\) 划分为 \(n\) 个子集 \(D_1, D_2, \dots, D_n\),特征 \(A\) 对 \(D\) 的条件熵为:
信息增益定义为:
选择信息增益最大的特征作为划分特征。
信息增益比(C4.5算法)
为解决信息增益对取值较多特征的偏好,引入信息增益比:
其中 \(H_A(D)\) 为特征 \(A\) 的固有值:
基尼指数(CART算法)
数据集 \(D\) 的基尼指数定义为:
特征 \(A\) 下集合 \(D\) 的基尼指数为:
选择使基尼指数最小的特征作为划分特征。
决策树生成算法
以ID3算法为例:
import numpy as np
from collections import Counter
class DecisionTree:
def __init__(self, max_depth=None):
self.max_depth = max_depth
self.tree = None
def fit(self, X, y, depth=0):
# 停止条件:所有样本属于同一类或达到最大深度
if len(np.unique(y)) == 1 or (self.max_depth and depth >= self.max_depth):
return Counter(y).most_common(1)[0][0]
n_features = X.shape[1]
best_gain = 0
best_feature = None
# 计算当前节点的熵
current_entropy = self._entropy(y)
# 遍历所有特征,选择信息增益最大的特征
for feature in range(n_features):
gain = self._information_gain(X[:, feature], y, current_entropy)
if gain > best_gain:
best_gain = gain
best_feature = feature
# 如果无法继续划分,返回多数类
if best_gain == 0:
return Counter(y).most_common(1)[0][0]
# 递归构建子树
tree = {}
feature_values = np.unique(X[:, best_feature])
for value in feature_values:
mask = X[:, best_feature] == value
subtree = self.fit(X[mask], y[mask], depth + 1)
tree[(best_feature, value)] = subtree
return tree
def _entropy(self, y):
"""计算熵"""
counts = np.bincount(y)
probabilities = counts / len(y)
return -np.sum([p * np.log2(p) for p in probabilities if p > 0])
def _information_gain(self, feature, y, current_entropy):
"""计算信息增益"""
unique_values = np.unique(feature)
conditional_entropy = 0
for value in unique_values:
mask = feature == value
subset_y = y[mask]
if len(subset_y) > 0:
conditional_entropy += (len(subset_y) / len(y)) * self._entropy(subset_y)
return current_entropy - conditional_entropy
def predict(self, X):
predictions = [self._predict_single(x, self.tree) for x in X]
return np.array(predictions)
def _predict_single(self, x, tree):
if not isinstance(tree, dict):
return tree
for (feature, value), subtree in tree.items():
if x[feature] == value:
return self._predict_single(x, subtree)
# 如果找不到匹配的分支,返回默认值
return 0
# 示例使用
if __name__ == "__main__":
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练决策树
dt = DecisionTree(max_depth=3)
dt.tree = dt.fit(X_train, y_train)
predictions = dt.predict(X_test)
print(f"决策树准确率: {accuracy_score(y_test, predictions):.2f}")
决策树剪枝
决策树容易过拟合训练数据,剪枝通过去除部分分支来简化模型,提高泛化能力。常用方法包括:
- /预剪枝/:在生成过程中提前停止树的生长
- /后剪枝/:先生成完整树,再自底向上剪枝
CART算法使用代价复杂度剪枝,定义损失函数:
其中:
- \(C(T)\) 为训练误差
- \(|T|\) 为叶节点个数
- \(\alpha\) 为复杂度参数
通过交叉验证选择最优的 \(\alpha\),得到剪枝后的最优子树。
决策树优缺点
/优点/:
- 可解释性强
- 无需数据预处理(如标准化)
- 能处理数值和类别特征
- 非参数模型,适应复杂关系
/缺点/:
- 容易过拟合
- 对数据微小变化敏感
- 可能产生偏斜树
实际应用中常使用集成方法(如随机森林、梯度提升树)来克服这些缺点。
逻辑斯谛回归与最大熵模型
支持向量机
EM 算法
什么是 EM 算法
EM 算法(Expectation-Maximization)是一种迭代优化算法,用于在概率模型中含有隐变 量(未观测数据)时估计参数。它通过交替执行两步来逐步逼近最大似然估计或最大后验估 计:
- E步(期望步):基于当前参数估计,计算隐变量的后验概率或期望。
- M步(最大化步):利用E步的结果,更新参数以最大化似然函数(或期望似然)。
特点:
数学解释
EM算法是一种迭代优化方法,用于含隐变量的概率模型参数估计。其核心是通过交替执行两 步来最大化似然函数:
E步(期望步):基于当前参数估计 \(\theta^{(t)}\),计算隐变量 \(Z\) 的条件分布 \(P(Z|X,\theta^{(t)})\),并构造完全数据的对数似然函数关于隐变量的期望:
$$Q(\theta|\theta^{(t)}) = \mathbb{E}_{Z|X,\theta^{(t)}}[\log P(X,Z|\theta)]$$M步(最大化步):更新参数以最大化 \(Q\) 函数:
$$\theta^{(t+1)} = \arg\max_{\theta} Q(\theta|\theta^{(t)})$$
收敛性:每次迭代保证似然函数 \(P(X|\theta)\) 单调不减,但可能收敛到局部最优解。常用于 高斯混合模型、隐马尔可夫模型等。
马尔可夫模型
马尔可夫模型主要用来模拟和分析物理现象中的空间、时间和上下文关联作用。
时间一路向前,可以用有向图表达;空间可以用无向图表达。
首先我们来了解什么是马尔可夫模型:
马尔可夫模型是一种描述状态序列的随机过程,核心是马尔可夫性:系统下一时刻的状态仅依赖于当前状态,与过去状态无关。
数学表达:
$$P(X_{t+1} | X_t, X_{t-1}, \dots, X_1) = P(X_{t+1} | X_t)$$应用:自然语言处理、生物序列分析、金融市场建模等。
简言之,它利用“无记忆性”简化复杂系统的概率建模。
吉布斯分布
吉布斯分布(Gibbs distribution)是一种基于能量函数的概率分布,形式为:
其中:
- \( E(x) \) 是能量函数,状态 \( x \) 的能量越低,其概率越高;
- \( T \) 是温度参数,控制分布的平坦程度;
- \( Z = \sum_x e^{-E(x)/T} \) 是配分函数,用于归一化。
在统计物理中,它描述系统在热平衡下的状态分布;在机器学习中,常用于无向图模型(如马尔可夫随机场)和能量模型。
/Hammersley-Clifford 定理/: 一个随机场是马尔可夫随机场当且仅当其联合分布可表示为吉布斯分布:
马尔可夫模型、隐马尔可夫模型与马尔可夫决策链
- 类型:
马尔可夫模型、隐马尔可夫模型与马尔可夫决策过程对比:
| 特性 | 马尔可夫模型 (MM) | 隐马尔可夫模型 (HMM) | 马尔可夫决策过程 (MDP) |
|---|---|---|---|
| 状态可观测性 | 完全可观测 | 状态隐藏,仅观测可见 | 完全可观测 |
| 动作 | 无 | 无 | 有(智能体决策) |
| 奖励 | 无 | 无 | 有(环境反馈) |
| 目标 | 描述状态转移 | 从观测推断隐藏状态 | 学习最优策略最大化累积奖励 |
| 核心问题 | 状态预测 | 概率计算、参数学习、解码 | 策略优化、值函数估计 |
| 应用 | 简单序列预测 | 语音识别、生物序列分析 | 机器人控制、游戏AI |
/关系/:
- HMM = MM + 隐藏状态
- MDP = MM + 动作 + 奖励
- POMDP(部分可观测MDP) = HMM + 动作 + 奖励
简言之:MM描述状态转移,HMM处理不完全观测,MDP引入决策与优化。
马尔可夫性质
马尔可夫性质是隐马尔可夫模型(HMM)的两个核心假设之一,具体包括:
齐次马尔可夫假设 状态序列满足马尔可夫性:下一时刻状态 \(X_{t+1}\) 仅依赖于当前状态 \(X_t\),与历史状态 \(X_{t-1}, X_{t-2}, \dots\) 独立。 数学表达:
$$P(X_{t+1} | X_t, X_{t-1}, \dots, X_1) = P(X_{t+1} | X_t)$$该假设简化了状态转移的建模,仅需估计 \(P(X_{t+1} | X_t)\)。观测独立性假设 任意时刻的观测 \(O_t\) 仅由当前状态 \(X_t\) 决定,与其他时刻的观测和状态无关。 数学表达:
$$P(O_t | X_T, O_T, X_{T-1}, O_{T-1}, \dots, X_1, O_1) = P(O_t | X_t)$$该假设使观测概率可局部计算,降低模型复杂度。
作用:这两个假设保证了HMM的高效推断(如用前向-后向算法计算概率,维特比算法解码状态序列)。
二阶马尔可夫链模型
二阶马尔可夫链模型扩展了马尔可夫性,使下一状态依赖于最近两个时刻的状态:
- /数学表达/:
$$P(X_{t+1} | X_t, X_{t-1}, \dots, X_1) = P(X_{t+1} | X_t, X_{t-1})$$
- /特点/:
- 通过增加历史信息捕捉更复杂的依赖关系,减少一阶模型的局限性。
- 状态空间增大:若状态数为 \(N\),则需建模 \(N^2\) 个转移概率 \(P(X_{t+1} | X_t, X_{t-1})\)。
- /应用/:
- 自然语言处理(如三元语法模型)。
- 基因序列分析、系统行为预测等需中短期记忆的场景。
本质是记忆长度=2的马尔可夫过程,平衡了复杂度与表达能力。
一般来说,我们最多使用到二阶马尔可夫链模型,对于更深的模型,我们比较少去探究。
马尔可夫模型的联合概率分布
对于马尔可夫模型,联合概率分布可分解为:
马尔可夫链(状态完全可观测):
- \(P(X_1)\):初始状态分布
- \(P(X_{t+1} | X_t)\):状态转移概率
隐马尔可夫模型(含观测序列 \(O_t\)):
- \(P(O_t | X_t)\):观测发射概率
核心思想:利用条件独立性(马尔可夫性+观测独立性)将联合分布分解为局部概率的乘积。
马尔可夫模型与扩散模型
马尔可夫模型与扩散模型
马尔可夫模型与扩散模型的核心联系在于:扩散模型本质上是特殊形式的马尔可夫链。
/扩散模型框架/:
前向过程:通过马尔可夫链逐步添加噪声
$$q(x_{1:T}|x_0) = \prod_{t=1}^T q(x_t|x_{t-1})$$其中 \(q(x_t|x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I)\)反向过程:通过马尔可夫链逐步去噪
$$p_\theta(x_{0:T}) = p(x_T) \prod_{t=1}^T p_\theta(x_{t-1}|x_t)$$学习参数 \(\theta\) 来近似真实的反向转移
/关键区别/:
- 传统马尔可夫模型:建模观测序列的依赖关系
- 扩散模型:专门设计用于数据生成,前向过程固定(加噪),反向过程可学习(去噪)
/关系总结/:扩散模型借用了马尔可夫链的框架结构,但目标是从噪声中生成高质量数据
隐马尔可夫模型
马尔可夫模型与时间序列
马尔可夫模型与时间序列的关系:
马尔可夫模型在时间序列中的应用:
- 马尔可夫链是时间序列的一种特殊形式,强调 无记忆性
- 适用于建模离散状态、有限依赖的时间序列
关键区别:
- /传统时间序列/(如ARIMA):关注连续值预测,依赖多个历史观测点
- /马尔可夫模型/:关注状态转移概率,仅依赖当前状态
结合应用:
- 马尔可夫切换模型:允许参数随隐藏状态变化
- 隐马尔可夫模型:用于时间序列的状态识别和*分段/
简言之,马尔可夫模型为时间序列提供了基于状态转移的建模视角,特别适合具有明显状态切换的序列数据。
什么是隐马尔可夫模型
是一种用于建模时序数据的统计模型,描述由隐藏的马尔可夫链随机生成不可观测的状态序列,再由各个状态生成观测序列的过程。
/核心要素/:
- 状态序列:隐藏的、不可直接观测的马尔可夫链
- 观测序列:由状态序列生成的可见数据
- 状态转移概率:隐藏状态间的转移概率
- 观测概率:从隐藏状态生成观测值的概率
- 初始状态概率:模型开始时的状态分布
/三个基本问题/:
- 概率计算:给定模型和观测序列,计算该序列出现的概率
- 学习问题:根据观测序列估计模型参数
- 解码问题:给定模型和观测序列,求最可能的状态序列
/典型应用/:
- 语音识别
- 自然语言处理(如词性标注)
- 生物信息学
- 手写体识别
隐马尔可夫模型的数学表示
/模型参数/:
- \( Q = \{q_1, q_2, \dots, q_N\} \):所有可能的状态集合(N个状态)
- \( V = \{v_1, v_2, \dots, v_M\} \):所有可能的观测集合(M个观测)
- \( I = (i_1, i_2, \dots, i_T) \):长度为T的状态序列
- \( O = (o_1, o_2, \dots, o_T) \):长度为T的观测序列
/三个核心概率分布/:
/状态转移概率矩阵/:
$$A = [a_{ij}]_{N \times N}, \quad a_{ij} = P(i_{t+1} = q_j | i_t = q_i)$$/观测概率矩阵/:
$$B = [b_j(k)]_{N \times M}, \quad b_j(k) = P(o_t = v_k | i_t = q_j)$$/初始状态概率向量/:
$$\pi = (\pi_1, \pi_2, \dots, \pi_N), \quad \pi_i = P(i_1 = q_i)$$
/完整模型表示/:
/联合概率/:
隐马尔可夫模型的例子
以下是一个简单的隐马尔可夫模型例子——天气预测模型:
/场景/: 根据观察到的海藻湿度(观测)推断天气状态(隐藏状态)。
/定义/:
- 隐藏状态 \( Q = \{\text{Sunny}, \text{Rainy}\} \)
- 观测 \( V = \{\text{Dry}, \text{Damp}, \text{Soggy}\} \)
/参数/:
初始概率 \( \pi = [0.6, 0.4] \)(初始为晴天的概率0.6,雨天0.4)
状态转移矩阵 \( A \):
$$A = \begin{bmatrix} 0.7 & 0.3 \\ 0.4 & 0.6 \end{bmatrix}$$- 晴天→晴天:0.7,晴天→雨天:0.3
- 雨天→晴天:0.4,雨天→雨天:0.6
观测概率矩阵 \( B \):
$$B = \begin{bmatrix} 0.6 & 0.3 & 0.1 \\ 0.1 & 0.4 & 0.5 \end{bmatrix}$$- 晴天生成 Dry:0.6, Damp:0.3, Soggy:0.1
- 雨天生成 Dry:0.1, Damp:0.4, Soggy:0.5
/示例推断/: 若观测序列 \( O = (\text{Dry}, \text{Soggy}) \),可用前向算法计算 \( P(O|\lambda) \),或维特比算法解码最可能天气序列(如:\( \text{Sunny} \rightarrow \text{Rainy} \))。
/应用/:
- 根据连续观测反推隐藏状态序列
- 模型可用于预测、分类或异常检测
HMM 的三个问题
隐马尔可夫模型主要解决以下三个基本问题:
/概率计算问题/(评估问题)
- /问题描述/:给定模型 \(\lambda = (A, B, \pi)\) 和观测序列 \(O = (o_1, o_2, \dots, o_T)\),计算该观测序列出现的概率 \(P(O|\lambda)\)
- /解决方法/:前向算法、后向算法
- /应用/:模型比较、序列分类、行为识别
/学习问题/(参数估计问题)
- /问题描述/:给定观测序列 \(O\),估计模型参数 \(\lambda = (A, B, \pi)\) 使得 \(P(O|\lambda)\) 最大
- /解决方法/:Baum-Welch算法(EM算法在HMM中的特例)
- /应用/:从数据中学习HMM参数
/解码问题/(预测问题)
- 问题描述/:给定模型 \(\lambda\) 和观测序列 \(O\),求最可能的状态序列 \(I^ = argmax_I P(I|O,λ)\)
- /解决方法/:维特比算法(动态规划)
- /应用/:状态识别、序列标注、语音识别
前向算法
前向算法用于高效计算观测序列的概率 \(P(O|\lambda)\),通过动态规划避免直接枚举所有可能状态序列。
/定义前向概率/:
/算法步骤/:
/初始化/:
$$\alpha_1(i) = \pi_i b_i(o_1), \quad i = 1,2,\dots,N$$/递推/:对 \(t = 1, 2, \dots, T-1\)
$$\alpha_{t+1}(j) = \left[\sum_{i=1}^N \alpha_t(i)a_{ij}\right]b_j(o_{t+1}), \quad j = 1,2,\dots,N$$/终止/:
$$P(O|\lambda) = \sum_{i=1}^N \alpha_T(i)$$
*复杂度分析:计算复杂度为 \(O(N^2T)\),远优于直接计算的 \(O(2TN^T)\)。
后向算法
后向算法与前向算法对称,同样用于计算 \(P(O|\lambda)\),定义后向概率:
/算法步骤/:
/初始化/:
$$\beta_T(i) = 1, \quad i = 1,2,\dots,N$$/递推/:对 \(t = T-1, T-2, \dots, 1\)
$$\beta_t(i) = \sum_{j=1}^N a_{ij}b_j(o_{t+1})\beta_{t+1}(j), \quad i = 1,2,\dots,N$$/终止/:
$$P(O|\lambda) = \sum_{i=1}^N \pi_i b_i(o_1)\beta_1(i)$$
/应用/:前后向概率结合可用于计算其他有用概率,如状态的后验概率。
维特比算法
维特比算法是一种动态规划算法,用于寻找最可能的隐藏状态序列(即维特比路径),常用于隐马尔可夫模型(HMM)的解码问题。其核心思想是利用动态规划逐步累积概率,并回溯得到最优路径。
问题定义
给定:
- 观测序列 \(O = (o_1, o_2, \dots, o_T)\)
- 隐藏状态集合 \(S = \{s_1, s_2, \dots, s_N\}\)
- 初始状态概率 \(\pi_i = P(q_1 = s_i)\)
- 状态转移概率 \(a_{ij} = P(q_{t+1} = s_j \mid q_t = s_i)\)
- 观测概率 \(b_j(o_t) = P(o_t \mid q_t = s_j)\)
目标:找到最可能的隐藏状态序列 \(Q^/ = (q_1, q_2, \dots, q_T)\),使得 \(P(Q \mid O)\) 最大。
动态规划步骤
定义两个变量:
- $δ_t(i)$:在时刻 \(t\),到达状态 \(s_i\) 的所有路径中的最大概率。
- $ψ_t(i)$:在时刻 \(t\),到达状态 \(s_i\) 的最优路径中,前一个状态是什么。
初始化(\(t=1\))
$$\delta_1(i) = \pi_i \cdot b_i(o_1), \quad \psi_1(i) = 0$$
递推(\(t=2\) 到 \(T\))
对于每个 \(t\) 和每个状态 $s_j$:
$$\delta_t(j) = \max_{1 \leq i \leq N} \left[ \delta_{t-1}(i) \cdot a_{ij} \right] \cdot b_j(o_t)$$$$\psi_t(j) = \arg\max_{1 \leq i \leq N} \left[ \delta_{t-1}(i) \cdot a_{ij} \right]$$
终止
$$P^/ = \max_{1 \leq i \leq N} \delta_T(i), \quad q_T^/ = \arg\max_{1 \leq i \leq N} \delta_T(i)$$
路径回溯(\(t=T-1\) 到 \(1\))
$$q_t^/ = \psi_{t+1}(q_{t+1}^*)$$
代码示例
以下是一个简单的 Python 实现,假设已知 HMM 参数和观测序列。
import numpy as np
def viterbi(obs, states, start_p, trans_p, emit_p):
"""
维特比算法实现
:param obs: 观测序列,如 [0, 1, 2]
:param states: 隐藏状态列表,如 ['A', 'B']
:param start_p: 初始概率,如 {'A': 0.6, 'B': 0.4}
:param trans_p: 转移概率,如 {'A': {'A': 0.7, 'B': 0.3}, 'B': {'A': 0.4, 'B': 0.6}}
:param emit_p: 发射概率,如 {'A': {0: 0.5, 1: 0.4, 2: 0.1}, 'B': {0: 0.1, 1: 0.3, 2: 0.6}}
:return: 最可能的隐藏状态序列及其概率
"""
V = [{}] # 存储每个时间步的 δ 和 ψ
# 初始化
for st in states:
V[0][st] = {"prob": start_p[st] * emit_p[st][obs[0]], "prev": None}
# 递推
for t in range(1, len(obs)):
V.append({})
for st in states:
max_tr_prob = max(V[t-1][prev_st]["prob"] * trans_p[prev_st][st] for prev_st in states)
for prev_st in states:
if V[t-1][prev_st]["prob"] * trans_p[prev_st][st] == max_tr_prob:
max_prob = max_tr_prob * emit_p[st][obs[t]]
V[t][st] = {"prob": max_prob, "prev": prev_st}
break
# 终止并回溯
opt_path = []
max_prob = max(value["prob"] for value in V[-1].values())
previous = None
for st, data in V[-1].items():
if data["prob"] == max_prob:
opt_path.append(st)
previous = st
break
for t in range(len(V) - 2, -1, -1):
opt_path.insert(0, V[t + 1][previous]["prev"])
previous = V[t + 1][previous]["prev"]
return opt_path, max_prob
# 示例参数
states = ['A', 'B']
obs = [0, 1, 2] # 观测序列
start_p = {'A': 0.6, 'B': 0.4}
trans_p = {'A': {'A': 0.7, 'B': 0.3}, 'B': {'A': 0.4, 'B': 0.6}}
emit_p = {'A': {0: 0.5, 1: 0.4, 2: 0.1}, 'B': {0: 0.1, 1: 0.3, 2: 0.6}}
path, prob = viterbi(obs, states, start_p, trans_p, emit_p)
print(f"最优隐藏状态序列: {path}")
print(f"对应概率: {prob}")
应用场景
- 自然语言处理:词性标注、命名实体识别。
- 生物信息学:基因序列分析。
- 通信系统:卷积码解码。
维特比算法通过动态规划高效地解决了 HMM 的解码问题,其时间复杂度为 \(O(T \cdot N^2)\),其中 \(T\) 是观测序列长度,\(N\) 是隐藏状态数。
Baum-Welch 算法
Baum-Welch算法是EM算法在HMM中的具体实现,用于解决学习问题——从观测序列估计模型参数。
/定义一些概率/:
/在时刻 \(t\) 处于状态 \(q_i\) 的概率/:
$$\gamma_t(i) = P(i_t = q_i | O, \lambda) = \frac{\alpha_t(i)\beta_t(i)}{\sum_{j=1}^N \alpha_t(j)\beta_t(j)}$$/在时刻 \(t\) 处于状态 \(q_i\) 且在时刻 \(t+1\) 处于状态 \(q_j\) 的概率/:
$$\xi_t(i,j) = P(i_t = q_i, i_{t+1} = q_j | O, \lambda) = \frac{\alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}{\sum_{i=1}^N\sum_{j=1}^N \alpha_t(i)a_{ij}b_j(o_{t+1})\beta_{t+1}(j)}$$
/参数重估公式/(M步):
/初始状态概率/:
$$\hat{\pi}_i = \gamma_1(i)$$/状态转移概率/:
$$\hat{a}_{ij} = \frac{\sum_{t=1}^{T-1} \xi_t(i,j)}{\sum_{t=1}^{T-1} \gamma_t(i)}$$/观测概率/:
$$\hat{b}_j(k) = \frac{\sum_{t=1}^T \gamma_t(j)\mathbb{I}(o_t = v_k)}{\sum_{t=1}^T \gamma_t(j)}$$其中 \(\mathbb{I}(o_t = v_k)\) 是指示函数,当 \(o_t = v_k\) 时为1,否则为0。
/算法流程/:
- 初始化模型参数 \(\lambda^{(0)}\)
- 重复直到收敛:
- E步:用当前参数 \(\lambda^{(n)}\) 计算 \(\gamma_t(i)\) 和 \(\xi_t(i,j)\)
- M步:用重估公式更新参数得到 \(\lambda^{(n+1)}\)
/特点/:保证每次迭代似然函数 \(P(O|\lambda)\) 单调递增,但可能收敛到局部最优。
RNN 与隐马尔可夫模型
*RNN(循环神经网络)与隐马尔可夫模型(HMM)对比
| 特性 | 隐马尔可夫模型 (HMM) | 循环神经网络 (RNN) |
|---|---|---|
| 模型类型 | 概率图模型(生成式) | 神经网络(判别式/生成式) |
| 状态表示 | 离散隐状态 | 连续隐状态(隐藏层向量) |
| 序列建模 | 马尔可夫假设(当前状态只依赖前一状态) | 通过隐藏状态记忆历史信息 |
| 参数学习 | EM算法(前向-后向算法) | 反向传播通过时间(BPTT) |
| 非线性关系 | 线性建模能力有限 | 强大的非线性建模能力 |
| 上下文依赖 | 有限历史依赖 | 理论上可建模长程依赖(实际有梯度问题) |
| 应用场景 | 语音识别、词性标注 | 语言建模、机器翻译、时序预测 |
关键区别:
- HMM是*概率生成模型/,显式建模状态转移和观测概率
- RNN是*判别模型/,直接学习输入到输出的映射
- RNN通过隐藏状态自动学习特征表示,HMM需要手动设计状态空间
- RNN更适合处理复杂、高维的序列数据
随机场
随机场基本概念
位点空间 Site Space
- 通常表示为图 \( G = (V, E) \),其中:
- \( V \):节点集合,每个节点对应一个随机变量
- \( E \):边集合,表示变量间的依赖关系
- 常见位点空间结构:
- /一维链/:序列标注(如条件随机场)
- /二维网格/:图像分割、纹理建模
- /任意图结构/:社交网络、分子结构
/核心思想/:每个位置的变量取值受其邻域变量影响,形成局部依赖的全局分布。
相空间 Phase Space
表示变量的取值空间 \(\Omega = \prod_{v \in V} \Omega_v\),其中 \(\Omega_v\) 是节点 \(v\) 的取值集合。
对于离散随机场,\(\Omega_v\) 是有限集合(如 \(\{0,1\}\) 或标签集)
对于连续随机场,\(\Omega_v \subseteq \mathbb{R}^n\)
/全局配置/:每个节点取一个值,形成 \(\mathbf{x} = (x_1, x_2, \dots, x_n) \in \Omega\)
随机场
定义在位点空间上的随机变量集合 \(\mathbf{X} = \{X_v\}_{v \in V}\),其联合分布由局部相互作用决定。
随机场是定义在概率空间 \((\Omega, \mathcal{F}, P)\) 上的随机变量集合,其中:
- \(\Omega\):相空间(所有可能配置的集合)
- \(\mathcal{F}\):\(\Omega\) 上的σ-代数
- \(P\):满足特定马尔可夫性的概率测度
邻域系统
一个位点的邻域定义为与此位点距离小于一个阈值的位点的集合。
\(\mathcal{N} = \{\mathcal{N}_s | s \in S\}\),其中 \(\mathcal{N}_s \subset S\) 是位置 \(s\) 的邻域,满足:
- \(s \notin \mathcal{N}_s\)(自身不在邻域内)
- \(t \in \mathcal{N}_s \Leftrightarrow s \in \mathcal{N}_t\)(对称性)
常见邻域:
- /一维链/:\( N_s = \{s-1, s+1\} \)
- /二维网格/:4-邻域或8-邻域
- /图结构/:节点的直接邻居
局部特性:随机场的联合分布由局部条件概率决定,通常表示为吉布斯分布:
关键特性
- /局部性/:每个位置的变量只与其邻域直接交互
- /全局一致性/:局部相互作用形成一致的全局概率分布
- /马尔可夫性/:给定邻域,变量与场中其他部分条件独立
常见类型
- /马尔可夫随机场(MRF)/:基于无向图的概率模型
- /条件随机场(CRF)/:在给定观测变量条件下的判别式模型
- /高斯随机场/:变量服从联合高斯分布
关键特性
- /局部性/:每个变量的条件分布仅依赖于其邻域变量
- /全局一致性/:局部条件分布需满足全局一致性条件(Hammersley-Clifford定理)
马尔可夫随机场
马尔可夫随机场(MRF)是满足局部马尔可夫性的随机场,即:
其中 \(X_{\setminus s}\) 表示除 \(s\) 外所有变量,\(X_{N_s}\) 是 \(s\) 的邻域变量。
/等价表述/:
- /全局马尔可夫性/:若集合 \(A\) 和 \(B\) 被集合 \(C\) 分隔,则 \(X_A \perp X_B | X_C\)
- /成对马尔可夫性/:非邻接节点在给定其他所有节点时条件独立
/Hammersley-Clifford 定理/: MRF 与吉布斯分布等价,即:
/应用/:
- 图像处理(去噪、分割)
- 统计物理(伊辛模型)
- 计算机视觉(立体匹配)
马尔可夫随机场由五个要素组成:
- 位点空间 \(S\):有限的节点集合
- 相空间 \(\Omega\):每个节点的取值空间
- 邻域系统 \(\mathcal{N}\):定义节点间的依赖关系
- /局部特征函数/:定义节点及其邻域的相互作用
- /全局概率分布/:通过局部特征构建的联合分布
/关键优势/:能够显式建模变量间的空间依赖关系,适用于具有局部交互的结构化数据。
吉布斯分布与 MRF 的等价性
其中:
- \( C \):图的团(clique)集合
- \( V_c \):团 \( c \) 的势函数(能量项)
- \( Z \):配分函数
/关键点/:
- 每个团势函数 \( V_c \) 对应局部相互作用
- 全局分布由局部势函数乘积的指数形式表示
- 马尔可夫性自然蕴含在团结构中
/意义/:为 MRF 提供了具体的概率计算框架,使模型参数化更直观。
应用实例
无向图模型应用实例
图像去噪
- 观测:含噪图像像素值
- 隐藏:真实图像像素值
- 势函数:相邻像素相似性(平滑约束) + 观测一致性
- 方法:MRF + 最大后验估计(MAP)
-
- 条件随机场(CRF)用于序列标注
- 节点:词性标签
- 边:相邻标签的转移概率
- 观测:词语序列
社交网络分析
- 节点:用户
- 边:社交关系
- 任务:社区发现、影响力传播建模
生物信息学
- 蛋白质结构预测
- 基因调控网络建模
立体视觉
- 像素视差估计
- 相邻像素视差平滑约束
核心优势:显式建模变量间的依赖关系,适用于具有空间/拓扑结构的数据。
条件随机场
判别式图模型,对条件概率\( P(Y|X) \)建模,用于序列标注。
- 直接建模 \( P(Y|X) \),避免HMM的独立性假设。
- 常用于自然语言处理中的命名实体识别、词性标注等任务。
概率无向图模型
图 transclusion
图是由结点和边组成的集合。
团
*团(Clique) 在图论中,团是一个无向图的完全子图,即其中任意两个顶点都直接相连。
- /最大团/:不被其他团包含的团(无法再添加顶点)。
- /极大团/:不是其他团的真子集(局部最大)。
在概率无向图模型(如马尔可夫随机场)中,团的定义用于分解联合概率(Hammersley-Clifford定理):
*团与最大团
团:无向图中任意两个结点均相邻的结点子集。即子集中所有结点两两之间有边连接。
最大团:一个团,若加入图中任何其他结点后都不再构成团,则称为最大团。即该团不被任何其他团所包含。
/示例/:
- 三角形结构(3个结点两两相连)是一个团,若无法加入第4个结点保持全连接,则为最大团。
- 在概率无向图模型中,团用于定义势函数,进而构建联合概率分布。
无向图的联合概率分布
无向图的联合概率分布可以写作图的最大团的势函数。
根据Hammersley-Clifford定理,概率无向图模型(马尔可夫随机场)的联合概率分布可分解为:
其中:
- \(\mathcal{C}\):图中所有最大团的集合
- \(X_C\):最大团 \(C\) 中包含的变量
- \(\psi_C(X_C)\):定义在团 \(C\) 上的势函数(非负函数)
- \(Z = \sum_X \prod_{C \in \mathcal{C}} \psi_C(X_C)\):归一化常数(配分函数)
/关键点/:
- 分解基于最大团,而非所有团(避免冗余计算)
- 势函数通常取指数形式:\(\psi_C(X_C) = \exp(-E(X_C))\),\(E\) 为能量函数
- 该分解体现了变量间的局部马尔可夫性
玻尔兹曼分布
无向图的势函数只需要是一个非负函数就行,这有一些太灵活了。在一些常用的势函数中,我们可以来看看玻尔兹曼分布。其使用的势函数是指数的 能量函数 。
玻尔兹曼分布(或称吉布斯分布)为势函数提供了具体的参数化形式:
其联合概率分布可表示为:
其中 \(E(X) = \sum_{C} E_C(X_C)\) 是整个配置 \(X\) 的总能量,\(Z\) 是配分函数,用于确保概率分布的归一化。
- 能量越低,概率越高(系统倾向于低能态)
- 广泛应用于统计物理、图像处理、受限玻尔兹曼机(RBM)
- 为概率无向图模型提供了可学习的参数化形式
概玄图模型
概率图模型是用图结构表示随机变量间依赖关系的框架,分为两类:
- 有向图模型(贝叶斯网络):边有方向,表示因果或条件依赖
- 无向图模型(马尔可夫随机场):边无方向,表示相关性
核心概念:
- 结点:随机变量
- 边:变量间的依赖关系
- 条件独立性:通过图的分离性判断
应用:
- 结构化预测
- 图像处理
- 自然语言处理
- 统计物理
条件随机场(CRF)是判别式的无向图模型,直接建模条件概率 \(P(Y|X)\),在序列标注任务中表现优异。
概率无向图模型
概率无向图模型(马尔可夫随机场)是用无向图表示随机变量间概率依赖关系的模型。
核心性质(马尔可夫性):
- /成对马尔可夫性/:给定其他所有变量,任意两个不相邻变量条件独立
- /局部马尔可夫性/:给定邻居变量,一个变量与其余变量条件独立
- /全局马尔可夫性/:被分离的变量集在给定分离集时条件独立
因子分解: 通过极大团分解为势函数的乘积:
特点:
- 适合表示对称的、相互的依赖关系
- 广泛应用于图像分割、社交网络分析、条件随机场等
条件随机场的定义与形式
定义
条件随机场(Conditional Random Field, CRF)是一种判别式无向图模型,用于在给定输入序列 \(X\) 的条件下,建模输出序列 \(Y\) 的条件概率分布。
/形式化定义/: 设 \(G = (V, E)\) 是一个无向图,\(Y = \{Y_v\}_{v \in V}\) 是与图中节点对应的随机变量。若在给定随机变量 \(X\) 的条件下,随机变量 \(Y_v\) 满足马尔可夫性,即:
/常用形式/(线性链条件随机场): 对于序列标注任务,通常使用线性链结构:
- \(f_k\):特征函数(状态特征和转移特征)
- \(\lambda_k\):特征权重(模型参数)
- \(Z(X)\):归一化因子
线性链条件随机场
线性链条件随机场是条件随机场在序列标注任务中最常用的形式,其图结构为链状,每个输出变量 \(Y_t\) 只与前一个输出变量 \(Y_{t-1}\) 和输入序列 \(X\) 相关。
/条件概率分布/:
其中:
- \(f_k(y_t, X, t)\):状态特征函数,描述位置 \(t\) 的标签 \(y_t\) 与输入 \(X\) 的关系
- \(g_l(y_{t-1}, y_t, X, t)\):转移特征函数,描述相邻标签 \(y_{t-1} \rightarrow y_t\) 的转移与输入 \(X\) 的关系
- \(\lambda_k, \mu_l\):对应的特征权重
- \(Z(X) = \sum_Y \exp\left(\sum_{t=1}^T \left[ \sum_k \lambda_k f_k + \sum_l \mu_l g_l \right]\right)\):归一化因子
/特点/:
- 直接建模 \(P(Y|X)\),避免生成式模型的强独立性假设
- 可灵活定义任意特征函数,捕捉复杂的上下文依赖
- 在命名实体识别、词性标注等序列标注任务中表现优异
参数化形式
线性链条件随机场的参数化形式通常表示为:
为简化表达,常将状态特征和转移特征统一表示:
其中:
- \(f_k(y_{t-1}, y_t, X, t)\):特征函数(包含状态特征和转移特征)
- \(w_k\):对应的权重参数
- \(Z(X) = \sum_Y \exp\left(\sum_{t=1}^T \sum_{k=1}^K w_k f_k(y_{t-1}, y_t, X, t)\right)\):配分函数
/矩阵形式/: 定义 \(M_t(y_{t-1}, y_t | X) = \exp\left(\sum_{k=1}^K w_k f_k(y_{t-1}, y_t, X, t)\right)\) 则条件概率可表示为:
这种参数化形式便于模型训练(极大似然估计)和解码(维特比算法)。
链上推理
链上推理(Chain Inference)是指在链式结构图模型(如线性链条件随机场)中进行概率 计算和状态推断的过程,主要包括前向-后向算法和维特比算法。
前向-后向算法
前向-后向算法用于高效计算配分函数 \(Z(X)\) 和边缘概率 \(P(y_t|X)\)。
/前向向量/: 定义 \(\alpha_t(y_t) = P(y_t, X_{1:t})\),表示到时刻 \(t\) 且状态为 \(y_t\) 的概率:
$$\alpha_1(y_1) = \exp\left(\sum_k w_k f_k(y_0, y_1, X, 1)\right)$$$$\alpha_t(y_t) = \sum_{y_{t-1}} \alpha_{t-1}(y_{t-1}) \exp\left(\sum_k w_k f_k(y_{t-1}, y_t, X, t)\right)$$/后向向量/: 定义 \(\beta_t(y_t) = P(X_{t+1:T} | y_t)\),表示从时刻 \(t+1\) 到 \(T\) 的观测概率:
$$\beta_T(y_T) = 1$$$$\beta_t(y_t) = \sum_{y_{t+1}} \beta_{t+1}(y_{t+1}) \exp\left(\sum_k w_k f_k(y_t, y_{t+1}, X, t+1)\right)$$/配分函数/:
$$Z(X) = \sum_{y_T} \alpha_T(y_T) = \sum_{y_1} \beta_1(y_1) \exp\left(\sum_k w_k f_k(y_0, y_1, X, 1)\right)$$/边缘概率/:
$$P(y_t|X) = \frac{\alpha_t(y_t)\beta_t(y_t)}{Z(X)}$$
维特比算法
维特比算法用于寻找最可能的标签序列 \(Y^/ = \arg\max_Y P(Y|X)\)。
定义:
- \(\delta_t(y_t)\):到时刻 \(t\) 且状态为 \(y_t\) 的最大得分
- \(\psi_t(y_t)\):记录最优路径的前一个状态
/算法步骤/:
- 初始化:
$$\delta_1(y_1) = \sum_k w_k f_k(y_0, y_1, X, 1)$$$$\psi_1(y_1) = 0$$
递推(\(t = 2\) 到 \(T\)):
$$\delta_t(y_t) = \max_{y_{t-1}} \left[ \delta_{t-1}(y_{t-1}) + \sum_k w_k f_k(y_{t-1}, y_t, X, t) \right]$$$$\psi_t(y_t) = \arg\max_{y_{t-1}} \left[ \delta_{t-1}(y_{t-1}) + \sum_k w_k f_k(y_{t-1}, y_t, X, t) \right]$$终止:
$$P^/ = \max_{y_T} \delta_T(y_T), \quad y_T^/ = \arg\max_{y_T} \delta_T(y_T)$$路径回溯(\(t = T-1\) 到 \(1\)):
$$y_t^/ = \psi_{t+1}(y_{t+1}^*)$$
/复杂度分析/:
- 前向-后向算法:\(O(T \cdot N^2)\),其中 \(N\) 是标签数
- 维特比算法:\(O(T \cdot N^2)\)
链上推理通过动态规划高效解决了CRF中的概率计算和解码问题,是序列标注任务的核心算法。
时间复杂度分析
线性链条件随机场的时间复杂度主要取决于前向-后向算法和维特比算法:
/训练阶段/(前向-后向算法):
- 前向向量计算:\(O(T \cdot |S|^2)\),其中 \(T\) 是序列长度,\(|S|\) 是标签数
- 后向向量计算:同样 \(O(T \cdot |S|^2)\)
- 特征期望计算:\(O(T \cdot |S|^2 \cdot K)\),其中 \(K\) 是特征数
- 总复杂度:\(O(T \cdot |S|^2 \cdot K)\)
/解码阶段/(维特比算法):
- 每个时间步:\(O(|S|^2)\)
- 总复杂度:\(O(T \cdot |S|^2)\)
/关键优化/:
- 利用稀疏特征减少 \(K\) 的有效值
- 使用动态规划避免重复计算
- 对于大规模标签集,可采用近似推理方法
/实际应用/:
- 对于典型的 NLP 任务(如词性标注),\(|S| \approx 50\),\(T \approx 20\),计算效率较高
- 对于大规模标签集(如细粒度命名实体识别),需考虑计算优化
代码示例
以下是一个简化的线性链条件随机场实现:
import numpy as np
class LinearChainCRF:
def __init__(self, n_labels):
self.n_labels = n_labels
self.weights = None
def forward_algorithm(self, features):
"""前向算法计算配分函数 Z(X)"""
T = len(features) # 序列长度
alpha = np.zeros((T, self.n_labels))
# 初始化
alpha[0] = np.exp(features[0])
# 递推
for t in range(1, T):
for j in range(self.n_labels):
alpha[t, j] = np.sum(alpha[t-1] * np.exp(features[t, j]))
# 配分函数
Z = np.sum(alpha[-1])
return alpha, Z
def viterbi_decode(self, features):
"""维特比算法解码最优序列"""
T = len(features)
delta = np.zeros((T, self.n_labels))
psi = np.zeros((T, self.n_labels), dtype=int)
# 初始化
delta[0] = features[0]
# 递推
for t in range(1, T):
for j in range(self.n_labels):
scores = delta[t-1] + features[t, j]
delta[t, j] = np.max(scores)
psi[t, j] = np.argmax(scores)
# 回溯
path = np.zeros(T, dtype=int)
path[-1] = np.argmax(delta[-1])
for t in range(T-2, -1, -1):
path[t] = psi[t+1, path[t+1]]
return path
# 示例使用
if __name__ == "__main__":
# 假设有3个标签,序列长度为4
n_labels = 3
T = 4
# 随机生成特征分数(实际中由特征函数计算)
np.random.seed(42)
features = np.random.randn(T, n_labels, n_labels)
crf = LinearChainCRF(n_labels)
best_path = crf.viterbi_decode(features)
print(f"最优标签序列: {best_path}")
强化学习
*强化学习(RL) 是机器学习的一个分支,关注智能体如何通过与环境交互学习最优策略以最大化累积奖励。
核心要素:
- /智能体(Agent)*:学习者与决策者
- /环境(Environment)*:智能体交互的外部系统
- /状态(State)*:环境的当前情况
- /动作(Action)*:智能体的可能行为
- /奖励(Reward)*:环境对动作的即时反馈
- /策略(Policy)*:状态到动作的映射
主要方法:
- /基于值函数/:学习状态或状态-动作对的价值(如Q-learning、DQN)
- /基于策略/:直接学习策略函数(如策略梯度)
- /演员-评论家/:结合值函数与策略学习
关键挑战:
- 探索与利用的权衡
- 信用分配问题
- 大规模状态空间处理
应用:游戏AI、机器人控制、推荐系统等。
马尔可夫决策过程
*马尔可夫决策过程(MDP) 是强化学习中的经典框架,用于建模序贯决策问题。其核心要素包括:
- 状态空间 \(S\):系统所有可能状态的集合
- 动作空间 \(A\):智能体可执行的动作集合
- 转移概率 \(P(s' \mid s, a)\):在状态 \(s\) 执行动作 \(a\) 后转移到状态 \(s&39;\) 的概率
- 奖励函数 \(R(s, a, s')\):执行动作后获得的即时奖励
- 折扣因子 \(\gamma\):权衡当前与未来奖励的重要性(0 ≤ γ ≤ 1)
目标:寻找最优策略 \(\pi^*(a \mid s)\),最大化累积期望回报:
求解方法:
- 值迭代(Value Iteration)
- 策略迭代(Policy Iteration)
- Q-learning(无模型方法)
隐马尔可夫模型与马尔可夫决策过程的关系
*隐马尔可夫模型(HMM) 与 马尔可夫决策过程(MDP) 都是基于马尔可夫性质的序列模型,但目标与结构不同:
| 维度 | HMM | MDP |
|---|---|---|
| 问题类型 | 无监督学习(概率生成模型) | 强化学习(决策优化) |
| 状态 | 隐藏状态(不可直接观测) | 完全可观测的状态 |
| 动作 | 无显式动作 | 有显式动作选择 |
| 目标 | 建模观测序列的生成概率(如解码、评估、学习) | 寻找最优策略以最大化累积奖励 |
| 核心要素 | 初始状态分布、状态转移矩阵、观测概率矩阵 | 状态、动作、转移概率、奖励函数、折扣因子 |
关系:
- 两者都依赖马尔可夫性(下一状态仅依赖当前状态)。
- MDP 可视为 HMM 的扩展:若将 MDP 中的动作固定为某种策略,则状态序列可看作一个马尔可夫链,类似于 HMM 中的隐藏状态链,但 MDP 强调通过动作交互进行主动优化。
- HMM 更侧重于推断(如根据观测推测隐藏状态),MDP 更侧重于控制(通过动作影响状态转移以获得最大收益)。
强化学习与马尔可夫决策过程
*强化学习与马尔可夫决策过程的关系
| 特性 | 马尔可夫决策过程 (MDP) | 强化学习 (RL) | |
|---|---|---|---|
| 本质 | 数学框架 | 学习方法 | |
| 关系 | RL 的理论基础与问题描述形式 | 解决 MDP 问题的算法集合 | |
| 状态可知性 | 通常假设完全已知 | 可处理状态未知或部分观测的情况 (POMDP) | |
| 模型依赖性 | 依赖转移概率 \(P(s'\ | s,a)\) 和奖励函数 \(R(s,a)\) | 分为模型基于(已知动力学)和模型无关(如 Q-learning) |
| 目标 | 提供形式化定义:寻找最优策略 \(\pi^*\) 以最大化期望回报 | 通过试错交互实际学习最优策略 | |
| 方法举例 | 值迭代、策略迭代(要求已知完整模型) | Q-learning、策略梯度、DQN(可从交互中学习) |
核心联系:
- MDP 为强化学习提供了标准问题表述,包括状态、动作、奖励、折扣因子等要素。
- 强化学习是解决 MDP 的算法体系,尤其适用于模型未知或环境复杂的情况。
- 当环境满足马尔可夫性时,RL 算法通常能更高效地求解 MDP 问题。
高斯混合模型
什么是高斯混合模型
*高斯混合模型(GMM) 是一种概率生成模型,用于对复杂数据分布进行建模,假设数据由多个高斯分布组合而成。
/核心思想/: 用 \( K \) 个高斯分布的加权和来近似任意连续概率密度函数:
- \(\pi_k\):混合系数(权重),满足 \(\sum \pi_k = 1\)
- \(\mathcal{N}(x \mid \mu_k, \Sigma_k)\):第 \(k\) 个高斯分布
/特点/:
- 属于无监督学习,常用于聚类、密度估计
- 每个高斯分量对应一个“软”聚类
- 参数估计通常使用 EM 算法(E步计算
后验概率,M步更新参数)
/应用/:
- 语音识别中的声学建模
- 图像分割
- 异常检测
蒙特卡罗方法
蒙特卡罗方法是一类基于随机采样的数值计算方法,通过生成大量随机样本并统计其性质来近似求解复杂问题。
基本思想
通过随机抽样和统计模拟来近似计算数学期望、积分、优化等复杂问题。其核心是利用大数定律:当样本数量足够大时,样本均值收敛于期望值。
主要步骤
- /构造概率模型/:将待求解问题转化为概率模型
- /随机抽样/:从概率分布中生成大量独立样本
- /统计计算/:基于样本计算所需的统计量
- /结果分析/:评估估计精度和收敛性
数学基础
对于积分问题:
根据大数定律,当 \(N \to \infty\) 时,\(\hat{I} \to I\)。
误差分析
蒙特卡罗估计的标准误差为:
这表明误差以 \(O(1/\sqrt{N})\) 的速率收敛,与问题维度无关,使其特别适合高维积分。
应用领域
- 高维数值积分
- 物理模拟(粒子输运、热传导)
- 金融工程(期权定价、风险分析)
- 机器学习(近似推断、强化学习)
Python 实现示例:计算圆周率
import numpy as np
import matplotlib.pyplot as plt
def monte_carlo_pi(n_samples):
"""使用蒙特卡罗方法估计圆周率"""
# 在单位正方形内生成随机点
x = np.random.uniform(-1, 1, n_samples)
y = np.random.uniform(-1, 1, n_samples)
# 计算落在单位圆内的点数
inside_circle = (x**2 + y**2) <= 1
pi_estimate = 4 * np.sum(inside_circle) / n_samples
return pi_estimate, x, y, inside_circle
# 不同样本量的实验
sample_sizes = [100, 1000, 10000, 100000]
results = []
plt.figure(figsize=(12, 8))
for i, n in enumerate(sample_sizes):
pi_est, x, y, inside = monte_carlo_pi(n)
results.append((n, pi_est, abs(pi_est - np.pi)))
# 绘制散点图
plt.subplot(2, 2, i+1)
plt.scatter(x[inside], y[inside], color='blue', s=1, alpha=0.5, label='圆内')
plt.scatter(x[~inside], y[~inside], color='red', s=1, alpha=0.5, label='圆外')
plt.title(f'N={n}, π≈{pi_est:.4f}, 误差={abs(pi_est-np.pi):.4f}')
plt.axis('equal')
plt.legend()
plt.tight_layout()
plt.show()
# 输出结果
print("蒙特卡罗方法估计圆周率结果:")
print("样本数\t估计值\t\t绝对误差")
for n, est, err in results:
print(f"{n}\t{est:.6f}\t{err:.6f}")
蒙特卡罗方法的变体
- /重要性采样/:针对罕见事件或峰值分布
- /马尔可夫链蒙特卡罗/:从复杂分布中采样
- /拟蒙特卡罗/:使用低差异序列代替随机数
- /序贯蒙特卡罗/:用于动态系统状态估计
优缺点
/优点/:
- 实现简单,易于并行化
- 收敛速率与维度无关
- 适用于复杂积分和优化问题
/缺点/:
- 收敛速度较慢(\(O(1/\sqrt{N})\))
- 对于罕见事件需要特殊处理
- 随机性导致结果具有方差
稀疏学习与压缩感知
RANSAC
机器学习:RANSAC算法做直线拟合 在实际应用中获取到的数据,常常会包含有噪声数据,这些噪声数据会使对模型的构建造成干扰,我们称这样的噪声数据点为outliers,那些对于模型构建起积极作用的我们称它们为inliers,RANSAC做的一件事就是先随机的选取一些点,用这些点去获得一个模型(这个讲得有点玄,如果是在做直线拟合的话,这个所谓的模型其实就是斜率),然后用此模型去测试剩余的点,如果测试的数据点在误差允许的范围内,则将该数据点判为inlier,否则判为outlier。