行莫
行莫
发布于 2025-11-22 / 5 阅读
0
0

机器学习算法分类:从有监督到强化学习

机器学习算法分类:从有监督到强化学习

引言

想象一下四种不同的学习方式:

  • 有监督学习:就像有老师教,给你题目和答案,让你学会解题
  • 无监督学习:就像自学,没有答案,自己发现规律
  • 半监督学习:就像老师只教一部分,剩下的自己学
  • 强化学习:就像通过试错学习,做对了给奖励,做错了不给奖励

理解这四种学习方式,就像理解不同的教学方法。本文将用生动的类比、数学表示和实际代码,帮你深入理解机器学习的算法分类。


第一部分:机器学习算法分类概览

分类体系

机器学习算法可以根据学习方式数据标签进行分类:

机器学习
├── 有监督学习(Supervised Learning)
│   ├── 分类(Classification)
│   └── 回归(Regression)
├── 无监督学习(Unsupervised Learning)
│   ├── 聚类(Clustering)
│   ├── 降维(Dimensionality Reduction)
│   └── 关联规则(Association Rules)
├── 半监督学习(Semi-supervised Learning)
└── 强化学习(Reinforcement Learning)

类比理解:

  • 有监督学习:有标准答案的学习
  • 无监督学习:没有标准答案的学习
  • 半监督学习:部分有标准答案的学习
  • 强化学习:通过奖励和惩罚学习

核心区别

学习方式数据标签学习目标类比
有监督学习有标签学习输入到输出的映射有老师教
无监督学习无标签发现数据中的模式自学
半监督学习部分有标签利用少量标签和大量无标签数据老师部分教
强化学习无标签,有奖励学习最优策略试错学习

第二部分:有监督学习(Supervised Learning)- "有老师教的学习"

什么是有监督学习?

**有监督学习(Supervised Learning)**是在有标签数据上学习,目标是学习从输入到输出的映射函数。

类比理解:

  • 就像有老师教的学生,老师给出题目和答案
  • 就像做练习题,每道题都有标准答案
  • 就像学习识别水果,每个水果都标明了名字

核心特点:

  • 有标签数据:每个样本都有对应的标签(答案)
  • 学习映射:学习从特征到标签的映射
  • 预测能力:训练后可以预测新样本的标签

数学表示

基本形式

给定训练数据集:
$$
D = {(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)}
$$

其中:

  • $x_i \in \mathcal{X}$:输入特征(第 $i$ 个样本的特征向量)
  • $y_i \in \mathcal{Y}$:输出标签(第 $i$ 个样本的标签)
  • $n$:样本数量

学习目标:
找到一个函数 $f: \mathcal{X} \rightarrow \mathcal{Y}$,使得对于新的输入 $x$,能够预测其标签 $y = f(x)$。

类比理解:

  • $x_i$:就像一道题目
  • $y_i$:就像这道题的答案
  • $f$:就像学会的解题方法
  • 目标:学会方法后,能够解新题目

损失函数

定义:
$$
L(f) = \frac{1}{n} \sum_{i=1}^{n} \ell(f(x_i), y_i)
$$

其中:

  • $\ell(f(x_i), y_i)$:样本 $i$ 的损失(预测值与真实值的差异)
  • $L(f)$:总体损失(所有样本的平均损失)

类比理解:

  • 就像考试的总分,分数越低越好(损失越小越好)
  • 每个样本的损失就像一道题的扣分
  • 总体损失就像总分

优化目标

目标:
$$
f^* = \arg\min_{f \in \mathcal{F}} L(f)
$$

即:在所有可能的函数中,找到使损失最小的函数。

类比理解:

  • 就像在所有可能的解题方法中,找到最好的方法
  • 最好的方法就是错误最少的方法

有监督学习的类型

1. 分类(Classification)

定义: 预测离散的类别标签。

类比理解:

  • 就像判断一张图片是猫还是狗
  • 就像判断一封邮件是正常邮件还是垃圾邮件
  • 就像判断一个病人是否患病

数学表示:

  • 输出空间:$\mathcal{Y} = {1, 2, ..., k}$($k$ 个类别)
  • 预测函数:$f: \mathcal{X} \rightarrow \mathcal{Y}$

例子:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
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
)

# 训练分类模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率:{accuracy:.3f}")

输出示例:

准确率:1.000

2. 回归(Regression)

定义: 预测连续的数值。

类比理解:

  • 就像预测房价
  • 就像预测温度
  • 就像预测销量

数学表示:

  • 输出空间:$\mathcal{Y} = \mathbb{R}$(实数)
  • 预测函数:$f: \mathcal{X} \rightarrow \mathbb{R}$

例子:

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import numpy as np

# 生成回归数据
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 训练回归模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print(f"RMSE:{rmse:.2f}")
print(f"R²:{r2:.3f}")

输出示例:

RMSE:9.87
R²:0.987

常见有监督学习算法

1. 线性回归(Linear Regression)

数学表示:
$$
f(x) = w^T x + b = \sum_{i=1}^{d} w_i x_i + b
$$

其中:

  • $w$:权重向量
  • $b$:偏置项
  • $d$:特征维度

损失函数(均方误差):
$$
L(w, b) = \frac{1}{n} \sum_{i=1}^{n} (y_i - (w^T x_i + b))^2
$$

类比理解:

  • 就像用一条直线拟合数据点
  • 权重就像直线的斜率
  • 偏置就像直线的截距

2. 逻辑回归(Logistic Regression)

数学表示:
$$
f(x) = \frac{1}{1 + e^{-(w^T x + b)}}
$$

类比理解:

  • 就像用一条 S 形曲线拟合数据
  • 输出是概率(0 到 1 之间)
  • 适合二分类问题

3. 决策树(Decision Tree)

类比理解:

  • 就像一棵判断树,从根节点开始,根据条件不断分支
  • 最终到达叶子节点,得到预测结果

例子:

from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
import matplotlib.pyplot as plt

# 训练决策树
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X_train, y_train)

# 可视化决策树
plt.figure(figsize=(20, 10))
tree.plot_tree(model, filled=True, feature_names=iris.feature_names, 
               class_names=iris.target_names)
plt.show()

4. 支持向量机(SVM)

数学表示:
$$
f(x) = \text{sign}(w^T x + b)
$$

类比理解:

  • 就像在两类数据之间画一条最佳分界线
  • 这条线使得两类数据之间的距离最大

5. 神经网络(Neural Network)

数学表示:
$$
f(x) = \sigma(W_2 \sigma(W_1 x + b_1) + b_2)
$$

其中:

  • $W_1, W_2$:权重矩阵
  • $b_1, b_2$:偏置向量
  • $\sigma$:激活函数

类比理解:

  • 就像多层加工厂,每层都对数据进行加工
  • 最终输出预测结果

有监督学习的优势与局限

优势:

  • 预测准确:有标准答案,可以学习准确的映射
  • 应用广泛:适合大多数实际问题
  • 评估容易:可以用准确率、误差等指标评估

局限:

  • 需要标签:需要大量标注数据
  • 标注成本高:人工标注费时费力
  • 泛化能力:可能过拟合训练数据

类比理解:

  • 优势:就像有老师教,学得快、学得准
  • 局限:就像需要大量练习题,准备成本高

第三部分:无监督学习(Unsupervised Learning)- "自学的学习"

什么是无监督学习?

**无监督学习(Unsupervised Learning)**是在无标签数据上学习,目标是发现数据中的隐藏模式。

类比理解:

  • 就像自学,没有标准答案,自己发现规律
  • 就像观察星空,发现星座的规律
  • 就像分析市场数据,发现消费趋势

核心特点:

  • 无标签数据:只有特征,没有标签
  • 发现模式:发现数据中的结构、聚类、关联等
  • 探索性:主要用于数据探索和理解

数学表示

基本形式

给定数据集:
$$
D = {x_1, x_2, ..., x_n}
$$

其中:

  • $x_i \in \mathcal{X}$:输入特征(第 $i$ 个样本的特征向量)
  • 没有标签 $y_i$

学习目标:
发现数据中的模式,如:

  • 聚类:将相似的数据分组
  • 降维:将高维数据降到低维
  • 关联规则:发现数据之间的关联

类比理解:

  • $x_i$:就像观察到的现象
  • 没有 $y_i$:就像没有标准答案
  • 目标:就像自己发现规律

无监督学习的类型

1. 聚类(Clustering)

定义: 将相似的数据点分组。

类比理解:

  • 就像把相似的水果放在一起
  • 就像把相似的人分到一组
  • 就像把相似的文档归类

数学表示:
将数据分成 $k$ 个簇:
$$
C = {C_1, C_2, ..., C_k}
$$

使得:

  • 同一簇内的数据相似度高
  • 不同簇之间的数据相似度低

例子:K-Means 聚类

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
import numpy as np

# 生成聚类数据
X, y_true = make_blobs(n_samples=300, centers=4, 
                       cluster_std=0.60, random_state=42)

# K-Means 聚类
kmeans = KMeans(n_clusters=4, random_state=42)
y_pred = kmeans.fit_predict(X)

# 可视化
plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c=y_true, cmap='viridis', s=50)
plt.title('真实聚类')
plt.xlabel('特征1')
plt.ylabel('特征2')

plt.subplot(1, 2, 2)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],
           c='red', marker='x', s=200, linewidths=3)
plt.title('K-Means 聚类结果')
plt.xlabel('特征1')
plt.ylabel('特征2')

plt.tight_layout()
plt.show()

K-Means 算法数学表示:

目标函数:
$$
J = \sum_{i=1}^{n} \sum_{j=1}^{k} w_{ij} |x_i - \mu_j|^2
$$

其中:

  • $w_{ij} = 1$ 如果 $x_i$ 属于簇 $j$,否则 $w_{ij} = 0$
  • $\mu_j$:簇 $j$ 的中心

优化目标:
$$
\min_{w, \mu} J
$$

类比理解:

  • 就像把数据点分配到最近的簇中心
  • 簇中心就像每个组的代表
  • 目标是最小化所有点到簇中心的距离

2. 降维(Dimensionality Reduction)

定义: 将高维数据降到低维,保留主要信息。

类比理解:

  • 就像把3D电影压缩成2D,保留主要画面
  • 就像把复杂信息简化成要点
  • 就像把高维空间投影到低维空间

数学表示:
找到一个映射 $f: \mathbb{R}^d \rightarrow \mathbb{R}^k$,其中 $k < d$。

例子:主成分分析(PCA)

from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# PCA 降维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)

# 可视化
plt.figure(figsize=(10, 6))
scatter = plt.scatter(X_reduced[:, 0], X_reduced[:, 1], 
                     c=y, cmap='viridis', s=50)
plt.colorbar(scatter)
plt.title('PCA 降维结果(4维 → 2维)')
plt.xlabel(f'第一主成分(解释方差:{pca.explained_variance_ratio_[0]:.2%})')
plt.ylabel(f'第二主成分(解释方差:{pca.explained_variance_ratio_[1]:.2%})')
plt.show()

print(f"总解释方差:{pca.explained_variance_ratio_.sum():.2%}")

PCA 数学表示:

目标: 找到主成分(Principal Components),使得投影后的方差最大。

第一主成分:
$$
w_1 = \arg\max_{|w|=1} \text{Var}(w^T X)
$$

第二主成分:
$$
w_2 = \arg\max_{|w|=1, w \perp w_1} \text{Var}(w^T X)
$$

类比理解:

  • 就像找到数据变化最大的方向
  • 第一主成分就像最重要的方向
  • 第二主成分就像第二重要的方向(且与第一主成分垂直)

3. 关联规则(Association Rules)

定义: 发现数据项之间的关联关系。

类比理解:

  • 就像发现"买啤酒的人通常也买尿布"
  • 就像发现"看A电影的人通常也看B电影"
  • 就像发现"有症状A的病人通常也有症状B"

数学表示:
关联规则:$A \Rightarrow B$

其中:

  • 支持度(Support):$P(A \cup B)$
  • 置信度(Confidence):$P(B|A) = \frac{P(A \cup B)}{P(A)}$

例子:

from mlxtend.frequent_patterns import apriori, association_rules
from mlxtend.preprocessing import TransactionEncoder
import pandas as pd

# 购物篮数据
transactions = [
    ['牛奶', '面包', '黄油'],
    ['面包', '黄油'],
    ['牛奶', '面包'],
    ['牛奶', '黄油'],
    ['面包', '黄油', '鸡蛋'],
    ['牛奶', '面包', '黄油', '鸡蛋']
]

# 转换为布尔矩阵
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df = pd.DataFrame(te_ary, columns=te.columns_)

# 挖掘频繁项集
frequent_itemsets = apriori(df, min_support=0.5, use_colnames=True)

# 生成关联规则
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.6)

print("关联规则:")
print(rules[['antecedents', 'consequents', 'support', 'confidence']])

输出示例:

关联规则:
  antecedents    consequents  support  confidence
0      (面包)        (黄油)    0.833     1.000
1      (黄油)        (面包)    0.833     1.000

类比理解:

  • 支持度:就像"面包和黄油一起出现的频率"
  • 置信度:就像"买了面包的人,买黄油的概率"

无监督学习的优势与局限

优势:

  • 不需要标签:不需要人工标注数据
  • 发现隐藏模式:可以发现数据中隐藏的结构
  • 数据探索:适合数据探索和理解

局限:

  • 难以评估:没有标准答案,难以评估效果
  • 结果解释:结果可能难以解释
  • 应用有限:不适合预测任务

类比理解:

  • 优势:就像自学,不需要老师,自己发现规律
  • 局限:就像自学,没有标准答案,不知道学得对不对

第四部分:半监督学习(Semi-supervised Learning)- "部分有老师教的学习"

什么是半监督学习?

**半监督学习(Semi-supervised Learning)**是在少量有标签数据和大量无标签数据上学习。

类比理解:

  • 就像老师只教一部分题目,剩下的自己学
  • 就像有少量标准答案,大量题目没有答案
  • 就像有少量标注数据,大量数据没有标注

核心特点:

  • 少量标签:只有少量样本有标签
  • 大量无标签:大量样本没有标签
  • 利用无标签数据:利用无标签数据帮助学习

数学表示

基本形式

给定数据集:
$$
D = D_l \cup D_u
$$

其中:

  • $D_l = {(x_1, y_1), ..., (x_l, y_l)}$:有标签数据($l$ 个样本)
  • $D_u = {x_{l+1}, ..., x_{l+u}}$:无标签数据($u$ 个样本)
  • 通常 $l \ll u$(有标签数据远少于无标签数据)

学习目标:
利用 $D_l$ 和 $D_u$ 学习函数 $f: \mathcal{X} \rightarrow \mathcal{Y}$。

类比理解:

  • $D_l$:就像少量有答案的题目
  • $D_u$:就像大量没有答案的题目
  • 目标:就像用少量答案和大量题目一起学习

半监督学习的假设

1. 平滑假设(Smoothness Assumption)

定义: 如果两个样本 $x_1$ 和 $x_2$ 在特征空间中接近,那么它们的标签也应该相似。

数学表示:
如果 $|x_1 - x_2|$ 很小,那么 $|f(x_1) - f(x_2)|$ 也应该很小。

类比理解:

  • 就像"相似的人应该有相似的标签"
  • 就像"相似的水果应该有相同的名字"

2. 聚类假设(Cluster Assumption)

定义: 如果两个样本在同一个簇中,那么它们很可能有相同的标签。

类比理解:

  • 就像"同一组的人应该有相同的标签"
  • 就像"同一类的水果应该有相同的名字"

3. 流形假设(Manifold Assumption)

定义: 高维数据实际上分布在低维流形上。

类比理解:

  • 就像3D空间中的2D曲面
  • 就像高维数据实际上在低维空间中

半监督学习方法

1. 自训练(Self-training)

算法流程:

  1. 用有标签数据训练初始模型
  2. 用模型预测无标签数据
  3. 选择高置信度的预测作为伪标签
  4. 用伪标签数据重新训练模型
  5. 重复步骤2-4

类比理解:

  • 就像先做有答案的题目,学会方法
  • 然后用方法做没答案的题目
  • 对做得有把握的题目,当作答案
  • 用这些"答案"继续学习

例子:

from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np

# 生成数据
X, y = make_classification(n_samples=1000, n_features=20, 
                          n_informative=10, random_state=42)

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 只标记10%的数据
n_labeled = int(0.1 * len(X_train))
indices = np.arange(len(X_train))
np.random.shuffle(indices)
labeled_indices = indices[:n_labeled]

# 创建半监督数据
y_train_semi = np.copy(y_train)
y_train_semi[~np.isin(np.arange(len(y_train)), labeled_indices)] = -1

print(f"有标签样本数:{np.sum(y_train_semi != -1)}")
print(f"无标签样本数:{np.sum(y_train_semi == -1)}")

# 自训练
base_model = SVC(probability=True)
self_training_model = SelfTrainingClassifier(base_model)
self_training_model.fit(X_train, y_train_semi)

# 预测
y_pred = self_training_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率:{accuracy:.3f}")

输出示例:

有标签样本数:80
无标签样本数:720
准确率:0.875

2. 协同训练(Co-training)

算法流程:

  1. 将特征分成两个视图(View)
  2. 在每个视图上训练一个模型
  3. 两个模型互相为对方提供伪标签
  4. 用伪标签数据重新训练模型
  5. 重复步骤3-4

类比理解:

  • 就像两个学生互相教对方
  • 一个学生从A角度学,另一个从B角度学
  • 他们互相提供"答案",一起进步

3. 图半监督学习(Graph-based Semi-supervised Learning)

数学表示:
构建图 $G = (V, E)$,其中:

  • $V$:节点(样本)
  • $E$:边(样本之间的相似度)

目标函数:
$$
\min_f \sum_{i=1}^{l} (f(x_i) - y_i)^2 + \lambda \sum_{i,j} w_{ij} (f(x_i) - f(x_j))^2
$$

其中:

  • 第一项:有标签数据的损失
  • 第二项:平滑项(相似样本应该有相似标签)
  • $\lambda$:平衡参数

类比理解:

  • 就像在社交网络中,相似的人应该有相似的标签
  • 第一项:就像有标签的人要保持标签
  • 第二项:就像相似的人要有相似的标签

半监督学习的优势与局限

优势:

  • 利用无标签数据:可以利用大量无标签数据
  • 减少标注成本:只需要少量标注数据
  • 提高性能:通常比只用有标签数据效果好

局限:

  • 假设依赖:依赖数据分布的假设
  • 错误传播:伪标签错误可能传播
  • 适用场景有限:不是所有场景都适用

类比理解:

  • 优势:就像用少量答案和大量题目一起学,学得更好
  • 局限:就像如果假设不对,可能学错

第五部分:强化学习(Reinforcement Learning)- "通过试错学习"

什么是强化学习?

**强化学习(Reinforcement Learning)**是通过与环境交互,通过奖励和惩罚学习最优策略。

类比理解:

  • 就像训练小狗,做对了给奖励,做错了不给奖励
  • 就像玩游戏,赢了得分,输了扣分
  • 就像学习走路,走对了继续,走错了调整

核心特点:

  • 交互式学习:与环境交互
  • 奖励信号:通过奖励信号学习
  • 序列决策:做出一系列决策
  • 延迟奖励:奖励可能延迟

数学表示:马尔可夫决策过程(MDP)

MDP 定义

**马尔可夫决策过程(Markov Decision Process, MDP)**由以下五元组定义:
$$
M = (S, A, P, R, \gamma)
$$

其中:

  • $S$:状态空间(State Space)
  • $A$:动作空间(Action Space)
  • $P$:状态转移概率 $P(s'|s, a)$
  • $R$:奖励函数 $R(s, a, s')$
  • $\gamma$:折扣因子(Discount Factor),$0 \leq \gamma \leq 1$

类比理解:

  • $S$:就像游戏的所有可能状态(位置、血量等)
  • $A$:就像可以做的所有动作(前进、后退、攻击等)
  • $P$:就像做某个动作后,到达某个状态的概率
  • $R$:就像做某个动作得到的奖励
  • $\gamma$:就像未来奖励的折扣(越远的奖励越不重要)

策略(Policy)

策略 $\pi$:从状态到动作的映射
$$
\pi: S \rightarrow A
$$

随机策略:
$$
\pi(a|s) = P(A_t = a | S_t = s)
$$

类比理解:

  • 就像在不同情况下应该采取什么行动
  • 就像"在敌人面前应该攻击,在安全时应该探索"

价值函数(Value Function)

状态价值函数 $V^\pi(s)$:
$$
V^\pi(s) = \mathbb{E}\pi \left[ \sum{t=0}^{\infty} \gamma^t R_{t+1} | S_0 = s \right]
$$

动作价值函数 $Q^\pi(s, a)$:
$$
Q^\pi(s, a) = \mathbb{E}\pi \left[ \sum{t=0}^{\infty} \gamma^t R_{t+1} | S_0 = s, A_0 = a \right]
$$

类比理解:

  • $V^\pi(s)$:就像"从状态 $s$ 开始,按照策略 $\pi$,能获得多少总奖励"
  • $Q^\pi(s, a)$:就像"在状态 $s$ 做动作 $a$,然后按照策略 $\pi$,能获得多少总奖励"

贝尔曼方程(Bellman Equation)

状态价值函数的贝尔曼方程:
$$
V^\pi(s) = \sum_a \pi(a|s) \sum_{s'} P(s'|s, a) [R(s, a, s') + \gamma V^\pi(s')]
$$

动作价值函数的贝尔曼方程:
$$
Q^\pi(s, a) = \sum_{s'} P(s'|s, a) [R(s, a, s') + \gamma \sum_{a'} \pi(a'|s') Q^\pi(s', a')]
$$

类比理解:

  • 就像"当前价值 = 即时奖励 + 未来价值的折扣"
  • 就像"现在的价值 = 现在的收益 + 未来的收益(打折扣)"

最优策略

最优策略 $\pi^*$:
$$
\pi^* = \arg\max_\pi V^\pi(s), \quad \forall s \in S
$$

最优动作价值函数:
$$
Q^*(s, a) = \max_\pi Q^\pi(s, a)
$$

最优策略:
$$
\pi^(s) = \arg\max_a Q^(s, a)
$$

类比理解:

  • 就像找到最好的策略,使得总奖励最大
  • 就像找到最好的方法,使得得分最高

强化学习算法

1. Q-Learning

Q-Learning 更新规则:
$$
Q(s, a) \leftarrow Q(s, a) + \alpha [R + \gamma \max_{a'} Q(s', a') - Q(s, a)]
$$

其中:

  • $\alpha$:学习率
  • $R$:即时奖励
  • $\gamma$:折扣因子

类比理解:

  • 就像"根据实际奖励和预期奖励的差异,更新Q值"
  • 就像"如果实际奖励比预期好,就提高Q值;如果差,就降低Q值"

例子:

import numpy as np
import matplotlib.pyplot as plt

# 简单的网格世界环境
class GridWorld:
    def __init__(self, size=5):
        self.size = size
        self.state = (0, 0)  # 起始位置
        self.goal = (size-1, size-1)  # 目标位置
        
    def reset(self):
        self.state = (0, 0)
        return self.state
    
    def step(self, action):
        # 动作:0=上, 1=下, 2=左, 3=右
        x, y = self.state
        if action == 0: y = max(0, y-1)
        elif action == 1: y = min(self.size-1, y+1)
        elif action == 2: x = max(0, x-1)
        elif action == 3: x = min(self.size-1, x+1)
        
        self.state = (x, y)
        
        # 奖励
        if self.state == self.goal:
            reward = 10
            done = True
        else:
            reward = -0.1
            done = False
            
        return self.state, reward, done

# Q-Learning
class QLearning:
    def __init__(self, n_states, n_actions, lr=0.1, gamma=0.9, epsilon=0.1):
        self.n_states = n_states
        self.n_actions = n_actions
        self.lr = lr  # 学习率
        self.gamma = gamma  # 折扣因子
        self.epsilon = epsilon  # 探索率
        self.Q = np.zeros((n_states, n_actions))
    
    def get_state_index(self, state):
        return state[0] * 5 + state[1]
    
    def choose_action(self, state):
        if np.random.random() < self.epsilon:
            return np.random.randint(self.n_actions)  # 探索
        else:
            state_idx = self.get_state_index(state)
            return np.argmax(self.Q[state_idx])  # 利用
    
    def update(self, state, action, reward, next_state, done):
        state_idx = self.get_state_index(state)
        next_state_idx = self.get_state_index(next_state)
        
        if done:
            target = reward
        else:
            target = reward + self.gamma * np.max(self.Q[next_state_idx])
        
        self.Q[state_idx, action] += self.lr * (target - self.Q[state_idx, action])

# 训练
env = GridWorld(size=5)
agent = QLearning(n_states=25, n_actions=4)

episodes = 500
rewards_history = []

for episode in range(episodes):
    state = env.reset()
    total_reward = 0
    steps = 0
    
    while steps < 100:
        action = agent.choose_action(state)
        next_state, reward, done = env.step(action)
        agent.update(state, action, reward, next_state, done)
        
        state = next_state
        total_reward += reward
        steps += 1
        
        if done:
            break
    
    rewards_history.append(total_reward)

# 可视化
plt.figure(figsize=(10, 6))
plt.plot(rewards_history)
plt.title('Q-Learning 训练过程')
plt.xlabel('回合')
plt.ylabel('总奖励')
plt.show()

print("训练完成!")
print("Q值矩阵(部分):")
print(agent.Q[:5, :])

2. 策略梯度(Policy Gradient)

策略梯度方法直接优化策略参数。

目标函数:
$$
J(\theta) = \mathbb{E}_\pi [R(\tau)]
$$

其中 $\tau$ 是轨迹(Trajectory)。

策略梯度定理:
$$
\nabla_\theta J(\theta) = \mathbb{E}\pi [\nabla\theta \log \pi_\theta(a|s) Q^\pi(s, a)]
$$

类比理解:

  • 就像直接优化策略参数
  • 就像"如果某个动作导致高奖励,就增加选择这个动作的概率"

3. 深度Q网络(DQN)

DQN结合深度学习和Q-Learning。

关键创新:

  • 经验回放(Experience Replay):存储经验,随机采样
  • 目标网络(Target Network):使用独立的目标网络

类比理解:

  • 就像用神经网络近似Q函数
  • 经验回放就像"记住过去的经验,随机复习"
  • 目标网络就像"用稳定的目标来学习"

强化学习的优势与局限

优势:

  • 不需要标签:不需要标注数据
  • 序列决策:适合序列决策问题
  • 适应性强:可以适应环境变化

局限:

  • 样本效率低:需要大量交互
  • 不稳定:训练可能不稳定
  • 难以调试:难以调试和解释

类比理解:

  • 优势:就像通过试错学习,不需要标准答案
  • 局限:就像需要大量尝试,可能学得慢

第六部分:四种学习方式的对比

对比表

学习方式数据标签学习目标典型应用优势局限
有监督学习有标签学习映射分类、回归准确、易评估需要标注
无监督学习无标签发现模式聚类、降维不需要标注难以评估
半监督学习部分标签利用无标签数据少量标注场景减少标注成本依赖假设
强化学习奖励信号学习策略游戏、机器人序列决策样本效率低

选择指南

选择有监督学习,如果:

  • 有大量标注数据
  • 需要预测准确的结果
  • 问题明确(分类或回归)

选择无监督学习,如果:

  • 没有标注数据
  • 需要探索数据
  • 需要发现隐藏模式

选择半监督学习,如果:

  • 只有少量标注数据
  • 有大量无标签数据
  • 数据分布满足假设

选择强化学习,如果:

  • 需要序列决策
  • 有环境可以交互
  • 有奖励信号

实际应用场景

有监督学习应用

分类:

  • 图像分类(猫、狗识别)
  • 垃圾邮件检测
  • 疾病诊断

回归:

  • 房价预测
  • 股票价格预测
  • 销量预测

无监督学习应用

聚类:

  • 客户分群
  • 文档聚类
  • 图像分割

降维:

  • 数据可视化
  • 特征提取
  • 数据压缩

半监督学习应用

  • 文本分类:大量文本,少量标注
  • 图像分类:大量图像,少量标注
  • 推荐系统:利用用户行为数据

强化学习应用

  • 游戏AI:AlphaGo、游戏智能体
  • 机器人控制:机器人行走、抓取
  • 推荐系统:动态推荐策略
  • 自动驾驶:决策制定

总结

核心概念回顾

  1. 有监督学习:有标签数据,学习映射

    • 数学:$f: \mathcal{X} \rightarrow \mathcal{Y}$
    • 类比:有老师教
  2. 无监督学习:无标签数据,发现模式

    • 数学:发现 $D$ 中的模式
    • 类比:自学
  3. 半监督学习:部分标签,利用无标签数据

    • 数学:利用 $D_l$ 和 $D_u$
    • 类比:老师部分教
  4. 强化学习:奖励信号,学习策略

    • 数学:MDP,$Q^\pi(s, a)$
    • 类比:试错学习

关键要点

有监督学习:

  • 需要标注数据
  • 学习准确
  • 应用广泛

无监督学习:

  • 不需要标注
  • 发现模式
  • 难以评估

半监督学习:

  • 少量标注
  • 利用无标签数据
  • 依赖假设

强化学习:

  • 交互学习
  • 序列决策
  • 样本效率低

类比总结

理解四种学习方式,就像理解不同的教学方法:

  • 有监督学习:就像有老师教,有标准答案,学得快、学得准
  • 无监督学习:就像自学,没有标准答案,自己发现规律
  • 半监督学习:就像老师只教一部分,剩下的自己学
  • 强化学习:就像通过试错学习,做对了给奖励,做错了不给奖励

掌握这四种学习方式,你就能根据问题选择合适的机器学习方法!


参考资料

  • Mitchell, T. M. (1997). Machine Learning. McGraw-Hill.
  • Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
  • Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction (2nd ed.). MIT Press.
  • Chapelle, O., Scholkopf, B., & Zien, A. (2009). Semi-Supervised Learning. MIT Press.

评论