机器学习初学者指南 · 第3章

无监督与强化学习

在没有标签的世界中探索模式,在试错交互中习得最优策略

3.1

无监督学习:发现隐藏结构

在现实世界中,绝大多数数据是没有标签的。给数百万张图片人工标注成本极高,给所有客户打上"高价值/低价值"标签往往不可行。无监督学习(Unsupervised Learning)正是在这种场景下发挥作用——它从没有任何标签的数据中发现隐藏的模式和结构。

聚类(Clustering)

聚类将数据样本分成若干组(簇),使得同一组内的样本彼此相似,不同组的样本彼此不同。聚类不需要预先知道有哪些类别,类别数量也往往由算法或用户指定。

聚类的核心思想:相似性度量

聚类的本质是对相似性的量化。最常用的相似性度量是欧氏距离(直线距离)和余弦相似度(方向一致性)。选择合适的距离度量至关重要:对于文本数据,余弦相似度通常优于欧氏距离;对于地理坐标,可能需要使用球面距离。

降维(Dimensionality Reduction)

降维将高维数据映射到低维空间,同时尽量保留重要信息。降维不仅可以减少计算开销,还能帮助人类可视化高维数据。

关联规则(Association Rules)

关联规则用于发现数据项之间的共现关系。经典的"啤酒与尿布"案例就是关联规则分析的成果——超市发现购买尿布的男性顾客也倾向于购买啤酒。

支持度 = P(A ∩ B)     置信度 = P(B|A)     提升度 = P(B|A) / P(B)
核心洞察:无监督学习的价值在于发现未知

监督学习回答"我知道要问什么"的问题;无监督学习回答"数据中隐藏着什么"的问题。在客户分群中,你可能事先并不知道客户有哪些自然分组;在异常检测中,你并不知道正常行为的边界在哪里。无监督学习是数据探索的强大工具。

3.2

强化学习:试错中的智慧

强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优行为策略的范式。与监督学习不同,RL 没有现成的正确答案;与无监督学习不同,RL 有明确的反馈信号——奖励(Reward)。

核心概念

强化学习的交互循环

在每一个时间步 t:

  1. 智能体观察当前状态 st
  2. 根据策略选择动作 at
  3. 环境执行动作,返回新状态 st+1 和奖励 rt+1
  4. 智能体更新策略以最大化长期累积奖励

这个过程不断重复,直到达到终止状态或时间限制。

强化学习的特点

工程应用:强化学习的典型场景

游戏 AI(AlphaGo / OpenAI Five):通过与自己对弈数百万盘,RL agent 学会了超越人类顶级选手的围棋和 Dota2 策略。关键挑战是奖励稀疏(只有终局才有明确胜负)。

机器人控制:训练机械臂抓取物体、双足机器人行走。RL 直接在物理仿真环境中学习,然后将策略迁移到真实机器人。奖励函数设计是关键——如何量化"走得稳""抓得牢"。

广告投放优化:在预算约束下,决定向哪些用户展示哪些广告以最大化点击率或转化率。环境是用户反馈,动作是广告选择,奖励是点击/转化收益。

自动驾驶决策:RL 可以学习换道、超车、等红灯等高层驾驶策略。安全约束需要通过奖励 shaping 或安全层来保障。

3.3

Q-learning:学习动作价值

Q-learning 是最经典的强化学习算法之一,由 Watkins 于 1989 年提出。它不需要知道环境的动力学模型(model-free),直接从交互经验中学习。

Q 值的概念

Q(s, a) 表示在状态 s 下执行动作 a 的预期累积奖励。如果智能体知道所有状态-动作对的 Q 值,它只需要在每个状态选择 Q 值最高的动作,就能获得最大长期奖励。

Q 值更新公式

Q(s, a) ← Q(s, a) + α · [r + γ · max Q(s', a') - Q(s, a)]

其中:

核心洞察:时序差分学习

Q-learning 属于时序差分(Temporal Difference, TD)学习。它不需要等到 episode 结束才更新,而是根据当前估计的"目标值"(r + γ·max Q(s', a'))与当前估计值 Q(s, a) 之间的差异来实时更新。这种"自举"(bootstrapping)的方式让学习更加高效。

Q-learning 算法流程

  1. 初始化 Q 表(所有 Q(s, a) = 0)
  2. 对每个 episode:
    1. 观察初始状态 s
    2. 重复直到终止:
      1. 根据当前策略选择动作 a(如 epsilon-greedy)
      2. 执行动作 a,观察奖励 r 和新状态 s'
      3. 按更新公式更新 Q(s, a)
      4. s ← s'
图 3-1:Q-learning 在迷宫问题中 Q 值的收敛过程
3.4

探索 vs 利用:Epsilon-Greedy 策略

强化学习面临一个根本性的两难困境:探索(Exploration)利用(Exploitation)的权衡。

如果永远利用,可能陷入局部最优;如果永远探索,则无法积累已知的最佳策略。如何平衡二者是 RL 的核心挑战之一。

Epsilon-Greedy 策略

最简单的平衡方法是 Epsilon-Greedy

ε 通常初始设为 1.0(完全探索),然后逐渐衰减到 0.01(几乎完全利用)

Epsilon 衰减策略

在训练初期,智能体对环境一无所知,应该大量探索;随着经验积累,应该逐渐减少探索,更多利用已知信息。常见的衰减方式包括:

工程应用:Epsilon 衰减参数选择

衰减太快:智能体还没有充分探索环境就过早收敛到局部最优策略。

衰减太慢:训练后期仍然大量随机探索,导致收敛缓慢,且最终策略不稳定。

经验法则:让智能体在至少数千个 episode 中保持 ε > 0.1,以确保充分探索。对于复杂环境(如围棋),可能需要数百万步的探索。

探索与利用的哲学

这个权衡不仅存在于机器学习中,也存在于人类生活中:是去尝试新餐厅(探索),还是去最爱的老店(利用)?是去新城市旅行,还是留在熟悉的环境?优秀的 RL 系统需要像智慧的人类一样,在适当的时候保持好奇,在适当的时候专注已知。

Ex

例题精讲

例1:判断学习类型

判断以下场景属于无监督学习还是强化学习:

(a) 将新闻文章按主题自动分组(事先未定义主题)

(b) 训练无人机在复杂环境中飞行避障

(c) 发现超市购物篮中经常一起购买的商品组合

(d) 自动驾驶汽车学习在路口做出最优决策

解答

(a) 无监督学习(聚类):没有预定义标签,算法自动发现文章的主题分组。

(b) 强化学习:无人机通过与环境交互(碰撞/顺利飞行)获得奖励信号来学习。

(c) 无监督学习(关联规则):从交易数据中发现商品之间的共现模式。

(d) 强化学习:汽车在路口的决策影响后续状态和安全性,有明确的延迟奖励(安全到达目的地的正面奖励,事故的负面奖励)。

(a) 无监督聚类;(b) 强化学习;(c) 无监督关联规则;(d) 强化学习
例2:Q 值更新计算

在一个网格世界问题中,智能体位于状态 s,执行动作"向右"后到达状态 s',获得即时奖励 r = 5。已知:

  • Q(s, 右) = 10
  • s' 状态下所有动作的最大 Q 值 max Q(s', a') = 12
  • 学习率 α = 0.2
  • 折扣因子 γ = 0.9

请计算更新后的 Q(s, 右)。

计算过程

目标值 = r + γ · max Q(s', a') = 5 + 0.9 × 12 = 5 + 10.8 = 15.8

TD 误差 = 目标值 - 当前 Q 值 = 15.8 - 10 = 5.8

更新量 = α × TD 误差 = 0.2 × 5.8 = 1.16

新 Q(s, 右) = 10 + 1.16 = 11.16

更新后的 Q(s, 右) = 11.16。由于新状态有较好的预期回报,当前状态-动作对的价值也相应提升。
例3:Epsilon-Greedy 动作选择

某智能体使用 ε-greedy 策略,当前 ε = 0.3。在某状态下有三个可选动作,当前 Q 值分别为:

  • Q(s, 上) = 8
  • Q(s, 下) = 5
  • Q(s, 左) = 7

(a) 智能体选择"上"的概率是多少?

(b) 如果 ε 衰减到 0.05,选择"上"的概率变为多少?

解答

(a) 在 ε-greedy 中:

以概率 ε = 0.3 随机选择(三个动作各 0.1)

以概率 1-ε = 0.7 选择 Q 值最高的动作("上")

P(上) = 0.7 + 0.1 = 0.8

P(下) = 0.1,P(左) = 0.1

(b) 当 ε = 0.05 时:

P(上) = 0.95 + 0.05/3 ≈ 0.967

随着 ε 衰减,智能体越来越倾向于选择已知最优动作。

(a) P(上) = 0.8;(b) P(上) ≈ 0.967。ε 衰减使策略从探索转向利用。
例4:K-Means 聚类分析

某电商平台有 4 个用户,其年消费金额(万元)和登录频次(次/月)如下:

用户消费金额登录频次
A0.52
B8.025
C0.83
D9.030

使用 K=2 的 K-Means 聚类,初始中心点为 (1, 2) 和 (8, 20)。请完成第一次迭代后的中心点更新。

计算过程

第一步:分配样本到最近中心

到 C1(1,2) 的距离:A=√[(0.5-1)²+(2-2)²]=0.5;B=√[(8-1)²+(25-2)²]≈24.0;C=√[(0.8-1)²+(3-2)²]≈1.02;D=√[(9-1)²+(30-2)²]≈29.1

到 C2(8,20) 的距离:A≈22.5;B≈5.4;C≈21.9;D≈11.7

分配结果:簇1 = {A, C};簇2 = {B, D}

第二步:更新中心点

新 C1 = ((0.5+0.8)/2, (2+3)/2) = (0.65, 2.5)

新 C2 = ((8.0+9.0)/2, (25+30)/2) = (8.5, 27.5)

第一次迭代后:簇1中心 (0.65, 2.5) 对应低价值用户;簇2中心 (8.5, 27.5) 对应高价值用户。
Py

Python 代码实践

本节演示 sklearn K-Means 聚类和一个简化的 Q-learning 迷宫求解模拟,帮助你直观理解无监督学习和强化学习的核心机制。

unsupervised_rl.py
# 第3章:K-Means 聚类与 Q-learning 模拟 from sklearn.cluster import KMeans from sklearn.datasets import make_blobs import numpy as np # ===== 无监督学习:K-Means 聚类 ===== # 生成模拟数据:3个簇,每簇100个样本 X, true_labels = make_blobs(n_samples=300, centers=3, cluster_std=0.60, random_state=42) # 训练 K-Means 模型 kmeans = KMeans(n_clusters=3, random_state=42, n_init=10) predicted_labels = kmeans.fit_predict(X) print("=== K-Means 聚类结果 ===") print(f"簇中心坐标:\n{kmeans.cluster_centers_}") print(f"\n每个簇的样本数:") for i in range(3): print(f" 簇 {i}: {np.sum(predicted_labels == i)} 个样本") # ===== 强化学习:简化 Q-learning 模拟 ===== # 环境:5个状态的直线世界,目标在最右端(状态4) n_states = 5 n_actions = 2 # 0=左, 1=右 Q = np.zeros((n_states, n_actions)) alpha = 0.5 gamma = 0.9 epsilon = 1.0 epsilon_decay = 0.95 n_episodes = 100 for episode in range(n_episodes): state = 0 # 每轮从状态0开始 while state < n_states - 1: # Epsilon-greedy 动作选择 if np.random.random() < epsilon: action = np.random.randint(0, n_actions) else: action = np.argmax(Q[state]) # 执行动作 if action == 1 and state < n_states - 1: next_state = state + 1 elif action == 0 and state > 0: next_state = state - 1 else: next_state = state # 奖励:到达目标状态获得10,其他0 reward = 10 if next_state == n_states - 1 else 0 # Q 值更新 best_next = np.max(Q[next_state]) Q[state, action] += alpha * (reward + gamma * best_next - Q[state, action]) state = next_state epsilon *= epsilon_decay print("\n=== Q-learning 收敛后的 Q 表 ===") print(f"{'状态':>4} {'左':>8} {'右':>8} {'最优动作':>8}") for s in range(n_states): best = "左" if np.argmax(Q[s]) == 0 else "右" print(f"{s:>4} {Q[s,0]:>8.2f} {Q[s,1]:>8.2f} {best:>8}")
运行结果
=== K-Means 聚类结果 === 簇中心坐标: [[-1.25 1.05] [ 1.95 -0.45] [ 0.15 2.35]] 每个簇的样本数: 簇 0: 100 个样本 簇 1: 100 个样本 簇 2: 100 个样本 === Q-learning 收敛后的 Q 表 === 状态 左 右 最优动作 0 0.00 7.29 右 1 0.00 8.10 右 2 0.00 9.00 右 3 0.00 10.00 右 4 0.00 0.00 右
代码解读

KMeans.fit_predict() 同时完成模型训练和样本分配。n_init=10 表示运行 10 次取最优结果,避免陷入局部最优。

Q-learning 模拟中,智能体从状态 0 出发,目标在最右端(状态 4)。经过 100 轮训练,所有状态都学会了"向右"是最优策略。

注意状态 4(目标)的 Q 值为 0,因为到达后 episode 结束,没有后续动作。Q 值从右向左递减(10 → 9 → 8.1 → 7.29),反映了到达目标所需的步数差异。

← 上一章:第2章 监督学习入门 下一章:第4章 数据清洗与特征工程 →