监督学习、无监督学习与强化学习
目录
一、监督学习
1.1 什么是监督学习?
监督学习是机器学习里最常用、也最容易上手的一类。你有一堆样本,每个样本都包含输入特征 和已知标签
——就像做完形填空时,题目(
)和标准答案(
)都给你。模型的任务,就是学一个函数
,让
尽量接近
。
如果还不了解机器学习,请看我之前发过的机器学习前言——认识机器学习
监督学习(Supervised Learning)分两大任务:
| 任务 | 问法 | 标签y长什么样 | 例子 |
|---|---|---|---|
| 回归 | 是多少? | 连续数字 | 房价、温度、销量 |
| 分类 | 是哪一类 / 是不是? | 离散类别 | spam、违约、猫/狗 |
前面讲过的多元线性回归、逻辑回归、决策树、随机森林,都属于监督学习。
1.2 为什么需要监督学习?
我们都知道:人工规则是什么
if 面积 > 100 且 房龄 < 5 → 价格 300 万
if 面积 > 100 且 房龄 ≥ 5 → 价格 250 万
……
它能干什么: 业务规则清晰、样本少时,手写规则完全可行。
但是换到另一个场景:就不行了
特征一多(几十个)、关系非线性、还要随数据更新——人工写不完、维护不了,也找不到最优阈值。
所以有了:监督学习
从带标签的历史数据里自动学:
- 回归:
,最小化预测误差(如 MSE)
- 分类:
,最小化分类损失(如交叉熵)
那么监督学习补上的,就是「有标准答案时,让机器从数据里学映射关系」。
1.3 模型如何工作?
回归(连续输出):
分类(离散输出):
| 符号 | 含义 |
|---|---|
| 输入特征 | |
| 已知标签(监督信号) | |
| 模型预测 |
1.4 怎么训练?
监督学习的训练 = 选损失函数 + 最小化:
| 任务 | 常见损失 | 结果 |
|---|---|---|
| 回归 | MSE | 预测值离真实值越远,罚越重 |
| 分类 | 交叉熵 | 该说是却不说,罚越重 |
数据划分习惯:训练集学参数,测试集检验泛化(模型没见过的上是否仍准)。
1.5 实际案例
1.5.1 监督学习——回归
第一步:获取数据
配套数据集/01_监督_回归.xlsx中,200 条,2 个特征 + 1 个连续标签(房价)——每条都有这是监督学习的标志。
| 样本ID | 面积_ |
房龄_ |
房价_ |
|---|---|---|---|
| 1 | -1.013 | 0.314 | -24.883 |
| 2 | 0.068 | -1.425 | -20.820 |
| 3 | 1.478 | -0.518 | 46.067 |
| 4 | 0.087 | -0.299 | 0.045 |
| … | … | … | … |
| 200 | 0.444 | 0.775 | 19.651 |
200 条、2 个特征 → 1 个连续 price;数值是模拟标准化数据,但结构和「多因素估房价」一致。
第二步:划分 + 训练
75% 训练、25% 测试;用 LinearRegression 最小化 MSE:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42
)
model = LinearRegression()
model.fit(X_train, y_train) # 学 w, b,使训练集 MSE 尽量小
y_pred = model.predict(X_test)
第三步:运行结果
学习到的 w: [40.524, 26.899] # 两个特征的权重
截距 b: -1.006
测试集 MSE: 132.06
测试集 R2: 0.9554
- R2 ≈ 0.96:测试集上约 95.5% 的房价波动能被模型解释 → 拟合很好
- MSE = 132.06:要和 price 的量级一起看;在本数据尺度下属于较小误差
代入第 2 行的样本: 面积 0.068,房龄 -1.425,真实 price = -20.82,预测 ≈ -36.59——单条有偏差,但整体 R2 仍高,说明多数样本拟合不错。
第四步:看图

横轴取特征 1(面积),圆点 = 测试集真实 price,叉号 = 预测 price。
50 个测试点里,绝大多数圆点与叉号几乎同一高度——同一 上圆叉重合 → 和 R²=0.955 一致,线性模型抓住了「面积越大、房价越高」的主趋势。整体没有「所有叉号系统性偏高/偏低」——不是整体截距错了,而是少数离群点拉高了 MSE;对2特征线性回归来说,可以接受。
1.5.2 监督学习——分类
第一步:获取数据
配套数据集/02_监督_分类.xlsx,300 条,2 个特征 + 标签 0/1:
| 样本ID | 指标1_x1 | 指标2_x2 | 是否正类_y |
|---|---|---|---|
| 1 | 0.733 | -1.431 | 0 |
| 2 | 0.656 | 0.843 | 1 |
| 3 | 0.538 | -2.057 | 0 |
| 4 | 1.289 | -0.079 | 1 |
| … | … | … | … |
| 300 | 1.716 | 1.168 | 1 |
300 条、2 特征——和决策树示例同一套二维分类数据,便于对比「线性边界 vs 树边界」。
第二步:训练
分类用 stratify=y 保持 0/1 比例;LogisticRegression 内部最小化交叉熵:
from sklearn.linear_model import LogisticRegression
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
# 看概率(Step 1 的 p_hat,Step 2 的阈值 0.5)
p1 = clf.predict_proba(X_test[0:1])[0, 1]
第三步:运行结果
权重 w: [0.736, 3.120]
截距 b: -0.467
测试集准确率: 0.9333
precision recall f1-score support
类 0 0.97 0.89 0.93 38
类 1 0.90 0.97 0.94 37
accuracy 0.93 75
准确率 93.3%:测试集 75 条里错 5 条(70 条判对)。
代入第 2 行的样本:P(y=1)≈0.934,真实y=1,按 判 1 → 正确。
和决策树对比(同一数据): 浅决策树可达 ~97%;逻辑回归 ~93%——边界是直线,略难完全分开边界附近点,仍属可用且正常的结果。
第四步:看图

绝大多数点落在「与自己颜色一致」的背景区;仅 5 个点跨到了对面——对应 93.3% 准确率。
1.6 监督学习在现实生活中的应用
| 场景 | 任务类型 |
|---|---|
| 房价预测、销量预测 | 回归 |
| 垃圾邮件识别、疾病诊断、信贷风控 | 分类 |
| 图像识别(猫/狗/数字) | 分类 |
| 机器翻译(序列到序列) | 监督(标签为正确译文) |
二、无监督学习
2.1 什么是无监督学习?
无监督学习面对的是只有x、没有y的数据。没有人告诉你「这条是猫、那条是狗」——你要自己发现:样本能不能分成几群?能不能用更少维度表示?能不能描述数据是怎么生成的?
无监督学习常见三大方向:
| 方向 | 在干什么 | 典型算法 |
|---|---|---|
| 聚类 | 找自然分组 | K-Means、层次聚类、DBSCAN |
| 降维 | 高维→低维,去冗余 | PCA、t-SNE、UMAP |
| 生成 | 学数据分布,再采样新数据 | GMM、VAE、GAN |
2.2 为什么需要无监督学习?
我们都知道:监督学习是什么
每条数据有 (x,y),模型学 f(x)→y——精准、可评估。
但是换到另一个场景:就不行了
- 大量数据没人标注(标注贵、慢)
- 业务问题本身不是「预测 y」,而是「客户分几群?」「特征能不能压缩?」
- 想生成与真实数据相似的新样本(数据增广、仿真)
这些场景没有现成的 y ,监督学习的框架不适用。
所以有了:无监督学习
不预测标签,而是学数据的内在结构:
- 聚类:哪些样本彼此更像
- 降维:哪些方向信息最多
- 生成:数据服从什么分布
所以无监督学习补上的,就是「没有标准答案时,从数据本身挖结构」。
2.3 无监督学习的三大方向
(1)聚类 — K-Means 直觉
- 随机选 K 个中心
- 每个点归到最近的中心
- 中心更新为组内均值
- 重复直到稳定
输出:每个样本属于哪一组(组号不是事先给定的标签)。
(2)降维 — PCA 直觉
找一个方向,使数据投影后方差最大 → 第一主成分;
再找与之正交且方差最大的方向 → 第二主成分……
4 维压成 2 维,仍保留大部分信息,便于画图或减少特征数。
(3)生成 — GMM 直觉
假设数据来自多个高斯分布的混合;
拟合各高斯的均值、方差、权重 → 再从该分布采样新点。
(进阶:VAE、GAN 用神经网络做更复杂的生成。)
2.4 无监督学习和监督学习的区别
| 监督学习 | 无监督学习 | |
|---|---|---|
| 标签 | 有 y | 无 y |
| 目标 | 预测准确 | 发现结构 / 表示 / 分布 |
| 评估 | 准确率、MSE 等 | 轮廓系数、重构误差、人工检视 |
| 数据表 | 必有标签列 | 只有特征列 |
2.5 实际案例
2.5.1 无监督学习——聚类
第一步:获取数据
配套数据集/03_无监督_聚类.xlsx,300 条,只有 2 个特征,没有 y:
| 样本ID | 特征1_ |
特征2_ |
|---|---|---|
| 1 | -7.293 | -7.645 |
| 2 | -7.654 | -7.226 |
| 3 | -1.769 | 7.916 |
| 4 | 4.444 | 2.962 |
| … | … | … |
| 300 | -6.097 | -5.660 |
300 条、2 特征——专门用来画「分群前 与 分群后」对比图。
第二步:训练
指定 K=3 个簇,算法自动找中心、分配样本:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
labels = kmeans.fit_predict(X) # 注意:没有 y,只有 X
第三步:运行结果
聚类中心:
簇0: [-2.621, 9.041]
簇1: [-6.883, -6.974]
簇2: [ 4.736, 2.007]
各簇样本数: 100, 100, 100
三组各 100 条,和模拟数据「3 个 blob」一致;中心点即各群的「代表位置」。
第四步:看图

- 左图:肉眼能看到 3 团灰点——一团在左下、一团在右上、一团在右中偏下——但不知道哪条属于哪群,这就是「无标签」。
- 右图:3 种颜色与 3 团灰点一一对应,边界处只有少量混色;轮廓系数 0.86(接近 1 表示簇内紧、簇间远)→ 聚类质量很好。
- 红色 X 分别落在三团中心附近(如右中簇中心约 (4.7, 2.0)(4.7,2.0),右上簇约 (−2.6, 9.0)(−2.6,9.0),左下簇约 (−6.9, −7.0)(−6.9,−7.0))——和第三步打印的中心一致。
- 右下、两簇交界处偶然有 1~2 个「离中心较远」的点(距本簇中心 >2.5>2.5),属于 blob 边缘的正常模糊,不是 K 选错;若右图变成满屏彩虹搅在一起,才说明 K 或数据本身有问题。
2.5.2 无监督学习——降维(PCA)
第一步:获取数据
配套数据集/04_无监督_降维.xlsx,200 条,4 个特征,无 yy(维度1~4)。
第二步:训练
先标准化,再压到 2 维主成分:
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=2, random_state=42)
X_2d = pca.fit_transform(X_scaled)
第三步:运行结果
主成分1 解释方差比: 48.77%
主成分2 解释方差比: 32.47%
合计: 81.25%
81% 的原始信息保留在 2 维里——用于可视化或减少特征数都合理。
第四步:看图
- 点云呈椭圆形,中心在原点附近,沿 PC1 方向略长(PC1 方差 48.8% >> PC2 的 32.5%)——和「第一主成分抓主要变化、第二主成分抓次要的」一致;81% 信息留在图里,形状没有塌成一条线。
- PC1 与 PC2 近似垂直(主成分本来正交),所以图上是斜向拉长的椭圆,不是乱团——说明 4 维里有结构被保留下来了,适合拿来做可视化。
- 这里没有颜色分组(本来就没有标签),看的是整体分布而非分类;若 200 点挤成一小团点、几乎无展宽,才说明 2 维不够或原数据本身方差太小。
2.5.2 无监督学习——生成(GMM 采样)
第一步:数据
复用 03_无监督_聚类.xlsx 的 300 条(仍无标签)。
第二步:训练 + 生成
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=3, random_state=42)
gmm.fit(X)
X_new, _ = gmm.sample(300) # 从学到的分布里「造」新点
第三步:运行结果
从 GMM 采样 300 个新点
原始数据均值 ≈ [-1.589, 1.358]
生成数据均值 ≈ [-1.685, 1.066]
均值接近 → 生成分布与原始分布大体一致 → 生成 合理。
第四步:看图

- × 与灰点重叠在同样的 3 团区域——左下、右上、右中各有一大片灰点,× 也主要撒在这三处,没有整片 × 飞到空白区 → 模型学到的 P(x) 和真实分布对得上。
- 原始各维标准差约 (4.88, 6.61),生成约 (4.94, 6.58)——图里两团点的疏密、范围看起来差不多,不是「× 比灰点瘦一圈或胖一圈」。
- 个别 × 落在两团交界处(两簇重叠处),这是混合高斯采样时的正常随机性,不代表生成失败;若大量 × 出现在完全没有灰点的角落,才要怀疑 K 或模型设错了。
2.6 无监督学习在现实生活中的应用
| 方向 | 应用 |
|---|---|
| 聚类 | 用户分群、市场细分、异常检测前置 |
| 降维 | 可视化、去噪、加速后续模型 |
| 生成 | 数据增广、仿真、艺术/文本生成(GAN 等) |
三、强化学习
3.1 什么是强化学习?
强化学习既不给你每条样本的标准答案 y,也不像无监督那样只静态地看一批数据。它是一个智能体(agent)在环境(environment)里一步步做决策:每做一个动作,环境反馈一个奖励(reward)——好动作加分,坏动作扣分。目标是学一套策略(policy),让长期累计奖励最大。
强化学习(Reinforcement Learning) 的核心循环:
状态 s → 智能体选动作 a → 环境返回 奖励 r + 新状态 s' → 再选动作 → …
3.2 为什么需要强化学习?
我们都知道:监督学习是什么
给 ,学
——适合「输入对应唯一正确答案」的问题。
但是换到另一个场景:就不行了
下棋、走迷宫、机器人控制、推荐系统长期点击——
- 没有每一步的「标准标签 y」
- 只有延迟反馈:走很多步后才知输赢;某步好不好要事后才能判断
- 动作会改变环境,影响未来能拿到什么奖励
监督学习无法直接描述「序列决策 + 长期回报」。
所以有了:强化学习
用 reward 代替 label:
- 不告诉智能体「这一步正确答案是什么」
- 只告诉「这一步之后得到了多少分」
- 智能体自己探索,学
(在什么状态下该做什么)
所以强化学习补上的,就是「通过试错和奖惩,学最优行为策略」。
3.3 强化学习的核心概念
| 概念 | 含义 |
|---|---|
| 状态 s | 当前局面(如棋盘上棋子位置) |
| 动作 a | 智能体可做的选择(上/下/左/右) |
| 奖励 r | 环境反馈的分数 |
| 策略 π | 状态 → 动作 的规则 |
| Q 值 Q(s,a) | 在 s 做 a 后,预期能拿多少长期奖励 |
Q-learning 更新(本项目代码用的公式):
- α:学习率
- γ:折扣因子(多看重未来奖励)
3.4 强化学习与监督/无监督学习的对比
| 监督学习 | 无监督学习 | 强化学习 | |
|---|---|---|---|
| 数据形态 | (x,y)数据集 | 静态 x 集合 | 交互序列 (s,a,r,s′) |
| 反馈 | 标签 y | 无 | 奖励 r |
| 目标 | 预测准 | 找结构 | 累计奖励大 |
| 典型场景 | 分类回归 | 聚类降维 | 游戏、控制、推荐 |
3.5 实际案例
没有 (x,y) 表格标签;智能体在迷宫里一步步走,用 reward 学策略。训练记录会保存到 数据集/05_强化学习_训练记录.csv;两张图弹窗显示。
第一步:环境长什么样?
4×4 网格(# = 墙,S = 起点,G = 终点):
S . . . ← 第 0 行
. # . . ← 第 1 行(中间是墙)
. . . # ← 第 2 行
. . . G ← 第 3 行
| 设定 | 数值 |
|---|---|
| 每步奖励 | -0.04(鼓励少走路) |
| 到达 G | +1.0 |
| 动作 | 0=上 1=右 2=下 3=左 |
| 训练轮数 | 500 episode |
没有「这一步标准答案 y」——只有走到终点才拿到大 reward。
第二步:训练(Q-learning)
# 核心更新(代码中每步执行)
Q[s, a] += alpha * (r + gamma * max(Q[s_next]) - Q[s, a])
# alpha=0.5 学习率, gamma=0.95 折扣因子
# epsilon=0.2 以 20% 概率随机探索
500 轮里,每轮从S出发,直到到G或超过100步;Q表示慢慢学会「哪格往哪走长期分最高」。
第三步:运行结果
训练 500 轮
前 20 轮平均总奖励: 0.446
后 20 轮平均总奖励: 0.708
最后一轮总奖励: 0.800
后 20 轮平均步数: 8.3 步
- 奖励从 ~0.45 升到 ~0.71 → 智能体确实在学(越接近 0.8 越好,理论上限约 1.0 减步数惩罚)
- 后 20 轮平均 8.3 步到终点 → 路径在变短
- 训练记录 CSV 每行:
episode, total_reward, steps
学成的策略(每格最优动作,0↑1→2↓3←):
↓ → ↓ ↓
↓ ↑ ↓ ↓
↓ ↓ → ←
→ → → ←
从S(左上)沿箭头可一路到G(右下),绕开 # 墙——与直觉路径一致 → 策略合理。
第四步:看图
图 1 学习曲线(浅线 = 每轮总 reward,红色粗线 = 20 轮滑动平均)

- 前几十轮浅线上下乱窜:第 1 轮甚至可到约 -2.8(随机乱走、步数多、每步 -0.04 累加)
- 红色滑动平均从约 0.6 一带逐步爬升,到 400~500 轮稳定在 0.70~0.71 附近,和后 20 轮平均 0.708 一致 → 智能体确实在学,不是碰运气。
- 后期浅线仍偶有抖动(ε=0.2 还在随机探索),但滑动平均不再掉头向下 → 策略已基本收敛。若红线一直贴在 0 附近,才说明没学到路。
图 2 策略图(每格箭头 = 该格 Q 值最大的动作;深色块 = 墙 #)

- 从 S(左上) 沿箭头:先连走 3 步 ↓ 到左下角,再连走 3 步 → 到 G(右下),共 6 步——绕开 (1,1) 的墙,与最短路径一致。
- 第 0 行 S 格箭头向下而非向右——因为正右是墙或绕路更远;第 1 行墙格无箭头(不可走)。
- 终点 G 格箭头向左(到 G 后 episode 结束,该格动作影响不大);其余可走格箭头都指向「离 G 更近」的方向,没有明显循环打转(如 ↑↓ 来回)→ 策略 合理可用。
3.6 监督学习在现实生活中的应用
| 场景 | 说明 |
|---|---|
| AlphaGo / 游戏 AI | 胜负作为 reward |
| 机器人行走 | 平衡、前进距离作 reward |
| 推荐系统 | 点击/停留时长作 reward |
| 自动驾驶(部分模块) | 安全、舒适、效率综合 reward |
更多推荐



所有评论(0)