04. 监督学习、无监督学习与强化学习
你好!欢迎回到零基础AI应用开发教程。在之前的课程中,我们了解了机器学习的基本原理。今天,我们将学习机器学习的主要类型,包括监督学习、无监督学习和强化学习。
一、监督学习的原理和应用
什么是监督学习?
监督学习(Supervised Learning)是一种机器学习方法,其中模型从带有标签的训练数据中学习。标签是我们希望模型预测的目标值。
核心概念:
- 输入数据:特征(Features)
- 输出数据:标签(Labels)
- 学习目标:学习从特征到标签的映射关系
监督学习的工作原理
- 数据准备:收集带有标签的训练数据
- 模型选择:选择适合任务的模型
- 模型训练:使用训练数据训练模型
- 模型评估:使用测试数据评估模型性能
- 预测应用:使用训练好的模型预测新数据
监督学习的类型
1. 分类(Classification)
分类任务是预测离散的类别标签。
例子:
- 垃圾邮件识别(垃圾邮件/非垃圾邮件)
- 图像分类(猫/狗/鸟)
- 情感分析(积极/消极/中性)
常用算法:
- 逻辑回归
- 决策树
- 随机森林
- 支持向量机
- 神经网络
2. 回归(Regression)
回归任务是预测连续的数值标签。
例子:
- 房价预测
- 股票价格预测
- 销售额预测
常用算法:
- 线性回归
- 多项式回归
- 岭回归
- Lasso回归
- 决策树回归
- 神经网络
监督学习的应用场景
- 金融:信用风险评估、欺诈检测
- 医疗:疾病诊断、患者预后
- 营销:客户流失预测、客户细分
- 零售:销售预测、需求预测
- 交通:交通流量预测、路线规划
二、无监督学习的原理和应用
什么是无监督学习?
无监督学习(Unsupervised Learning)是一种机器学习方法,其中模型从未标记的训练数据中学习模式和结构。
核心概念:
- 输入数据:没有标签的特征
- 学习目标:发现数据中的模式、结构或关系
- 输出:数据的分组、表示或变换
无监督学习的工作原理
- 数据准备:收集未标记的训练数据
- 模型选择:选择适合任务的无监督学习算法
- 模型训练:使用训练数据训练模型
- 结果分析:分析模型发现的模式或结构
- 应用:将学习到的模式应用到新数据
无监督学习的类型
1. 聚类(Clustering)
聚类任务是将相似的数据点分组到同一簇中。
例子:
- 客户分群
- 图像 segmentation
- 异常检测
常用算法:
- K-means
- 层次聚类
- DBSCAN
- Gaussian Mixture Models
2. 降维(Dimensionality Reduction)
降维任务是减少数据的维度,同时保留重要信息。
例子:
- 数据可视化
- 特征选择
- 噪声去除
常用算法:
- 主成分分析(PCA)
- t-SNE
- UMAP
- Linear Discriminant Analysis (LDA)
3. 关联规则学习(Association Rule Learning)
关联规则学习任务是发现数据中项目之间的关联关系。
例子:
- 购物篮分析
- 推荐系统
- 市场购物分析
常用算法:
- Apriori
- FP-Growth
无监督学习的应用场景
- 营销:客户分群、市场 basket 分析
- 金融:异常交易检测、 fraud detection
- 医疗:疾病亚型发现、医疗图像分析
- 社交网络:社区检测、用户行为分析
- 图像处理:图像 segmentation、特征提取
三、强化学习的原理和应用
什么是强化学习?
强化学习(Reinforcement Learning)是一种机器学习方法,其中智能体(Agent)通过与环境交互学习最优策略,以最大化累积奖励。
核心概念:
- 智能体(Agent):学习和执行动作的实体
- 环境(Environment):智能体交互的外部世界
- 状态(State):环境的当前情况
- 动作(Action):智能体可以执行的操作
- 奖励(Reward):环境对动作的反馈
- 策略(Policy):从状态到动作的映射
强化学习的工作原理
- 初始化:智能体初始化策略
- 交互:智能体在环境中执行动作
- 反馈:环境返回新状态和奖励
- 学习:智能体根据奖励更新策略
- 优化:不断改进策略以最大化累积奖励
强化学习的类型
1. 值迭代(Value Iteration)
通过评估每个状态的价值来学习最优策略。
2. 策略迭代(Policy Iteration)
直接优化策略,而不是通过价值函数。
3. Q-learning
通过学习状态-动作值函数来选择最优动作。
4. 深度强化学习
使用深度神经网络来近似价值函数或策略。
强化学习的应用场景
- 游戏:AlphaGo、Atari游戏
- 机器人:机器人控制、路径规划
- 金融:算法交易、投资组合管理
- 交通:交通信号控制、自动驾驶
- 工业:资源调度、流程优化
四、三种学习方式的对比和适用场景
| 特性 | 监督学习 | 无监督学习 | 强化学习 |
|---|---|---|---|
| 数据需求 | 带标签的数据 | 无标签的数据 | 交互环境 |
| 学习目标 | 预测标签 | 发现模式 | 最大化奖励 |
| 反馈机制 | 直接反馈(标签) | 无直接反馈 | 延迟反馈(奖励) |
| 适用场景 | 预测、分类 | 聚类、降维 | 决策、控制 |
| 计算复杂度 | 中等 | 中等 | 高 |
| 数据效率 | 高 | 高 | 低 |
五、实践案例:每种学习方式的典型应用
案例1:监督学习 - 垃圾邮件识别
任务:识别邮件是否为垃圾邮件
数据:带标签的邮件数据集(垃圾邮件/非垃圾邮件)
算法:逻辑回归
工作流程:
- 收集带有标签的邮件数据
- 提取邮件特征(如词频、主题长度等)
- 训练逻辑回归模型
- 评估模型性能
- 用模型预测新邮件
代码示例:
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 示例数据
emails = [
"Buy cheap watches!",
"Hello, how are you?",
"Get rich quick!",
"Meeting tomorrow at 10am",
"Win a free car!"
]
labels = [1, 0, 1, 0, 1] # 1=垃圾邮件, 0=非垃圾邮件
# 特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, labels, 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}")
# 预测新邮件
new_email = ["Click here to get a discount"]
new_email_vector = vectorizer.transform(new_email)
prediction = model.predict(new_email_vector)
print(f"预测结果: {'垃圾邮件' if prediction[0] == 1 else '非垃圾邮件'}")案例2:无监督学习 - 客户分群
任务:根据客户购买行为对客户进行分群
数据:客户购买历史数据(无标签)
算法:K-means聚类
工作流程:
- 收集客户购买数据
- 提取特征(如购买频率、平均订单金额等)
- 使用K-means算法进行聚类
- 分析每个聚类的特征
- 制定针对不同客户群的营销策略
代码示例:
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 示例数据:客户购买行为数据
# 特征:[购买频率, 平均订单金额, 最近购买天数]
customer_data = np.array([
[5, 100, 2],
[10, 200, 1],
[2, 50, 7],
[15, 300, 1],
[3, 80, 5],
[8, 150, 3],
[1, 30, 10],
[12, 250, 2]
])
# 使用K-means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(customer_data)
# 可视化结果
plt.scatter(customer_data[:, 0], customer_data[:, 1], c=clusters, cmap='viridis')
plt.xlabel('购买频率')
plt.ylabel('平均订单金额')
plt.title('客户分群')
plt.show()
# 分析每个聚类
for i in range(3):
cluster_data = customer_data[clusters == i]
print(f"聚类 {i+1}:")
print(f" 平均购买频率: {np.mean(cluster_data[:, 0]):.2f}")
print(f" 平均订单金额: {np.mean(cluster_data[:, 1]):.2f}")
print(f" 平均最近购买天数: {np.mean(cluster_data[:, 2]):.2f}")
print()案例3:强化学习 - 迷宫导航
任务:智能体学习如何在迷宫中找到出口
环境:迷宫环境,智能体可以上下左右移动
算法:Q-learning
工作流程:
- 定义迷宫环境
- 初始化Q表
- 智能体在环境中探索
- 根据奖励更新Q表
- 利用学习到的Q表找到最优路径
代码示例:
import numpy as np
# 定义迷宫环境
# 0: 空地, 1: 墙壁, 2: 起点, 3: 终点
maze = np.array([
[1, 1, 1, 1, 1, 1, 1],
[1, 2, 0, 0, 0, 0, 1],
[1, 1, 1, 0, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 1],
[1, 0, 1, 1, 1, 0, 1],
[1, 0, 0, 0, 0, 3, 1],
[1, 1, 1, 1, 1, 1, 1]
])
# 定义动作: 上(0), 右(1), 下(2), 左(3)
actions = [0, 1, 2, 3]
# 初始化Q表
q_table = np.zeros((maze.shape[0], maze.shape[1], len(actions)))
# 超参数
learning_rate = 0.1
discount_factor = 0.9
exploration_rate = 1.0
max_exploration_rate = 1.0
min_exploration_rate = 0.01
exploration_decay_rate = 0.01
# 训练智能体
num_episodes = 1000
max_steps_per_episode = 100
for episode in range(num_episodes):
# 重置状态到起点
state = (1, 1) # 起点位置
done = False
steps = 0
while not done and steps < max_steps_per_episode:
# 探索与利用
exploration_threshold = np.random.uniform(0, 1)
if exploration_threshold > exploration_rate:
# 利用:选择Q值最大的动作
action = np.argmax(q_table[state[0], state[1], :])
else:
# 探索:随机选择动作
action = np.random.choice(actions)
# 执行动作
if action == 0: # 上
new_state = (state[0]-1, state[1])
elif action == 1: # 右
new_state = (state[0], state[1]+1)
elif action == 2: # 下
new_state = (state[0]+1, state[1])
else: # 左
new_state = (state[0], state[1]-1)
# 检查新状态是否有效
if (new_state[0] < 0 or new_state[0] >= maze.shape[0] or
new_state[1] < 0 or new_state[1] >= maze.shape[1] or
maze[new_state[0], new_state[1]] == 1):
# 撞墙,回到原状态
new_state = state
reward = -1
elif maze[new_state[0], new_state[1]] == 3:
# 到达终点
reward = 100
done = True
else:
# 普通空地
reward = -0.1
# 更新Q表
old_q_value = q_table[state[0], state[1], action]
next_max_q = np.max(q_table[new_state[0], new_state[1], :])
new_q_value = old_q_value + learning_rate * (reward + discount_factor * next_max_q - old_q_value)
q_table[state[0], state[1], action] = new_q_value
# 更新状态
state = new_state
steps += 1
# 衰减探索率
exploration_rate = min_exploration_rate +
(max_exploration_rate - min_exploration_rate) *
np.exp(-exploration_decay_rate * episode)
print("训练完成!")
# 测试智能体
state = (1, 1)
done = False
path = [state]
while not done:
action = np.argmax(q_table[state[0], state[1], :])
if action == 0: # 上
new_state = (state[0]-1, state[1])
elif action == 1: # 右
new_state = (state[0], state[1]+1)
elif action == 2: # 下
new_state = (state[0]+1, state[1])
else: # 左
new_state = (state[0], state[1]-1)
if maze[new_state[0], new_state[1]] == 3:
done = True
path.append(new_state)
state = new_state
print("找到的路径:", path)六、总结与思考
通过这节课的学习,我们了解了:
- 监督学习:从带有标签的数据中学习,用于分类和回归任务
- 无监督学习:从未标记的数据中发现模式,用于聚类、降维和关联规则学习
- 强化学习:通过与环境交互学习最优策略,用于决策和控制任务
- 三种学习方式的特点和适用场景
思考问题
- 你能举例说明哪些问题适合使用监督学习、无监督学习或强化学习?
- 三种学习方式各有什么优缺点?
- 在实际应用中,如何选择合适的学习方式?
下节课预告
在下节课中,我们将学习深度学习的基本概念,了解神经网络的结构、激活函数、前向传播和反向传播等核心概念。
希望这节课对你有所帮助!如果你有任何问题或想法,欢迎在评论区分享。让我们继续探索AI的奇妙世界!