目录

一、监督学习

1.1 什么是监督学习?

1.2 为什么需要监督学习?

1.3 模型如何工作?

1.4 怎么训练?

1.5 实际案例

    1.5.1 监督学习——回归

    1.5.2 监督学习——分类

1.6 监督学习在现实生活中的应用

二、无监督学习

2.1 什么是无监督学习?

2.2 为什么需要无监督学习?

2.3 无监督学习的三大方向

2.4 无监督学习和监督学习的区别

2.5 实际案例

    2.5.1 无监督学习——聚类

    2.5.2 无监督学习——降维(PCA)

    2.5.2 无监督学习——生成(GMM 采样)

2.6 无监督学习在现实生活中的应用

三、强化学习

3.1 什么是强化学习?

3.2 为什么需要强化学习?

3.3 强化学习的核心概念

3.4 强化学习与监督/无监督学习的对比

3.5 实际案例

3.6 监督学习在现实生活中的应用


一、监督学习

1.1 什么是监督学习?

    监督学习是机器学习里最常用、也最容易上手的一类。你有一堆样本,每个样本都包含输入特征 x 和已知标签 y——就像做完形填空时,题目(x)和标准答案(y)都给你。模型的任务,就是学一个函数 f,让 f(x)尽量接近 y

    如果还不了解机器学习,请看我之前发过的机器学习前言——认识机器学习

监督学习(Supervised Learning)分两大任务:

任务 问法 标签y长什么样 例子
回归 是多少? 连续数字 房价、温度、销量
分类 是哪一类 / 是不是? 离散类别 spam、违约、猫/狗

    前面讲过的多元线性回归、逻辑回归、决策树、随机森林,都属于监督学习。

    多元线性回归与Logistic回归

    决策树与随机森林

1.2 为什么需要监督学习?

    我们都知道:人工规则是什么

    if 面积 > 100 且 房龄 < 5 → 价格 300 万
    if 面积 > 100 且 房龄 ≥ 5 → 价格 250 万
    ……

    它能干什么: 业务规则清晰、样本少时,手写规则完全可行。

    但是换到另一个场景:就不行了

    特征一多(几十个)、关系非线性、还要随数据更新——人工写不完、维护不了,也找不到最优阈值。

    所以有了:监督学习

    从带标签的历史数据里自动学f(x)

  • 回归:\hat{y}=f(x),最小化预测误差(如 MSE)
  • 分类:\hat{y}=\arg max_{k}P(y=k\mid k),最小化分类损失(如交叉熵)

   那么监督学习补上的,就是「有标准答案时,让机器从数据里学映射关系」。

1.3 模型如何工作?

回归(连续输出):

\hat{y}=w_{0}+w_{1}x_{1}+w_{2}x_{2}+...

分类(离散输出):

\hat{p}=P(y=1\mid x),\hat{y}=\left\{\begin{matrix} 1,& \hat{p}\geq 0.5 \\ 0,&\hat{p}< 0.5 \end{matrix}\right.

符号 含义
x 输入特征
y 已知标签(监督信号)
\hat{y} 模型预测

1.4 怎么训练?

    监督学习的训练 = 选损失函数 + 最小化

任务 常见损失 结果
回归 MSE 预测值离真实值越远,罚越重
分类 交叉熵 该说是却不说,罚越重

\hat{f}=\arg minL(f(x),y)

    数据划分习惯:训练集学参数,测试集检验泛化(模型没见过的x上是否仍准)。

1.5 实际案例

    1.5.1 监督学习——回归

    第一步:获取数据

    配套数据集/01_监督_回归.xlsx中,200 条,2 个特征 + 1 个连续标签(房价)——每条都有y这是监督学习的标志。

样本ID 面积_x_{1} 房龄_x_{2} 房价_y(标签)
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 个测试点里,绝大多数圆点与叉号几乎同一高度——同一 x_{1}上圆叉重合 → 和 R²=0.955 一致,线性模型抓住了「面积越大、房价越高」的主趋势。整体没有「所有叉号系统性偏高/偏低」——不是整体截距错了,而是少数离群点拉高了 MSE;对2特征线性回归来说,可以接受。

    1.5.2 监督学习——分类

    第一步:获取数据

    配套数据集/02_监督_分类.xlsx300 条,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,按 \hat{p}\geq 0.5判 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 直觉

  1. 随机选 K 个中心
  2. 每个点归到最近的中心
  3. 中心更新为组内均值
  4. 重复直到稳定

    输出:每个样本属于哪一组(组号不是事先给定的标签)。

(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_x_{1} 特征2_x_{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 为什么需要强化学习?

    我们都知道:监督学习是什么

    给 (x,y),学 f(x)=y——适合「输入对应唯一正确答案」的问题。

    但是换到另一个场景:就不行了

    下棋、走迷宫、机器人控制、推荐系统长期点击——

  • 没有每一步的「标准标签 y」
  • 只有延迟反馈:走很多步后才知输赢;某步好不好要事后才能判断
  • 动作会改变环境,影响未来能拿到什么奖励

    监督学习无法直接描述「序列决策 + 长期回报」。

    所以有了:强化学习

    用 reward 代替 label

  • 不告诉智能体「这一步正确答案是什么」
  • 只告诉「这一步之后得到了多少分」
  • 智能体自己探索,学 \pi (s) \rightarrow a(在什么状态下该做什么)

    所以强化学习补上的,就是「通过试错和奖惩,学最优行为策略」。

3.3 强化学习的核心概念

概念 含义
状态 s 当前局面(如棋盘上棋子位置)
动作 a 智能体可做的选择(上/下/左/右)
奖励 r 环境反馈的分数
策略 π 状态 → 动作 的规则
Q 值 Q(s,a) 在 s 做 a 后,预期能拿多少长期奖励

Q-learning 更新(本项目代码用的公式):

Q(s,a)\leftarrow Q(s,a)+\alpha [r+\gamma _{max}Q(s^{​{}'},a{}')-Q(s,a)]

  • α:学习率
  • γ:折扣因子(多看重未来奖励)

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
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐