机器学习算法分类:从有监督到强化学习
引言
想象一下四种不同的学习方式:
- 有监督学习:就像有老师教,给你题目和答案,让你学会解题
- 无监督学习:就像自学,没有答案,自己发现规律
- 半监督学习:就像老师只教一部分,剩下的自己学
- 强化学习:就像通过试错学习,做对了给奖励,做错了不给奖励
理解这四种学习方式,就像理解不同的教学方法。本文将用生动的类比、数学表示和实际代码,帮你深入理解机器学习的算法分类。
第一部分:机器学习算法分类概览
分类体系
机器学习算法可以根据学习方式和数据标签进行分类:
机器学习
├── 有监督学习(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)
算法流程:
- 用有标签数据训练初始模型
- 用模型预测无标签数据
- 选择高置信度的预测作为伪标签
- 用伪标签数据重新训练模型
- 重复步骤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)
算法流程:
- 将特征分成两个视图(View)
- 在每个视图上训练一个模型
- 两个模型互相为对方提供伪标签
- 用伪标签数据重新训练模型
- 重复步骤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、游戏智能体
- 机器人控制:机器人行走、抓取
- 推荐系统:动态推荐策略
- 自动驾驶:决策制定
总结
核心概念回顾
-
有监督学习:有标签数据,学习映射
- 数学:$f: \mathcal{X} \rightarrow \mathcal{Y}$
- 类比:有老师教
-
无监督学习:无标签数据,发现模式
- 数学:发现 $D$ 中的模式
- 类比:自学
-
半监督学习:部分标签,利用无标签数据
- 数学:利用 $D_l$ 和 $D_u$
- 类比:老师部分教
-
强化学习:奖励信号,学习策略
- 数学: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.