当前位置: 首页 > news >正文

监督学习(Supervised Learning)和 无监督学习(Unsupervised Learning)详解

一、监督学习 (Supervised Learning)

1. 定义

监督学习是指在 输入数据 (X)目标标签 (Y) 已知的情况下,训练一个模型,使其能够学习输入与输出之间的映射关系。

  • 输入:特征(Feature)
  • 输出:标签(Label,可能是类别或连续值)
  • 目标:学习函数 f:X→Yf: X \to Yf:XY,并能泛化到新的数据

2. 常见任务

分类 (Classification)

1. 定义

分类是监督学习中的一种任务,目标是 学习输入特征与离散类别之间的映射关系
输入 XXX → 输出类别 Y∈{1,2,...,K}Y \in \{1, 2, ..., K\}Y{1,2,...,K}

比如:邮件分类 → “垃圾邮件” / “正常邮件”。


2. 数学模型

分类器需要学习一个函数 f:X→Yf: X \to Yf:XY,本质上是计算 某样本属于某个类别的概率

P(Y=k∣X=x),k=1,2,...,K P(Y=k|X=x), \quad k=1,2,...,K P(Y=kX=x),k=1,2,...,K

最终的预测结果是:

y^=arg⁡max⁡kP(Y=k∣X=x) \hat{y} = \arg\max_k P(Y=k|X=x) y^=argkmaxP(Y=kX=x)


3. 常见算法
  • 线性分类器:逻辑回归 (Logistic Regression)
  • 非线性模型:决策树、随机森林
  • 支持向量机 (SVM)
  • 神经网络 (MLP, CNN, RNN)
  • 集成学习:XGBoost, LightGBM, CatBoost

4. 应用场景
  • 文本分类:垃圾邮件检测、情感分析
  • 图像分类:人脸识别、医学影像诊断
  • 金融风控:贷款违约预测
  • 工业检测:产品合格/不合格分类

5. 实践示例(垃圾邮件分类)
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# 加载数据 (新闻数据替代垃圾邮件示例)
categories = ['sci.space', 'rec.sport.baseball']
data = fetch_20newsgroups(subset='train', categories=categories)
test_data = fetch_20newsgroups(subset='test', categories=categories)# 特征提取 (TF-IDF)
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(data.data)
X_test = vectorizer.transform(test_data.data)# 训练逻辑回归
clf = LogisticRegression(max_iter=300)
clf.fit(X_train, data.target)# 预测
y_pred = clf.predict(X_test)
print("分类准确率:", accuracy_score(test_data.target, y_pred))

回归 (Regression)

1. 定义

回归任务是 预测连续数值 的监督学习问题。
输入 XXX → 输出一个连续变量 Y∈RY \in \mathbb{R}YR

例如:房价预测(输入特征:面积、位置 → 输出房价)。


2. 数学模型

回归模型试图找到一个函数 f(x)f(x)f(x),使得:

Y≈f(X)+ϵ Y \approx f(X) + \epsilon Yf(X)+ϵ

其中 ϵ\epsilonϵ 表示误差项。
常见的损失函数是 均方误差 (MSE)

L=1N∑i=1N(yi−y^i)2 L = \frac{1}{N} \sum_{i=1}^N (y_i - \hat{y}_i)^2 L=N1i=1N(yiy^i)2


3. 常见算法
  • 线性回归 (Linear Regression)
  • 正则化回归:Ridge (L2 正则)、Lasso (L1 正则)
  • 非线性模型:决策树回归、随机森林回归
  • 梯度提升树:XGBoost、LightGBM
  • 神经网络回归

4. 应用场景
  • 房价预测:输入特征 → 预测房价
  • 股票预测:输入历史数据 → 预测未来价格
  • 温度预测:输入环境参数 → 输出温度
  • 工业控制:输入传感器数据 → 预测设备寿命

5. 实践示例(房价预测)
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 加载数据 (加州房价数据集)
data = fetch_california_housing()
X, y = data.data, data.target# 划分训练/测试集
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)
print("MSE:", mean_squared_error(y_test, y_pred))

分类 vs 回归 对比总结

特点分类 (Classification)回归 (Regression)
输出离散类别 (有限集合)连续数值 (实数域)
损失函数交叉熵 (Cross Entropy)均方误差 (MSE)
模型示例逻辑回归、SVM、决策树、神经网络线性回归、随机森林、XGBoost
应用场景垃圾邮件分类、人脸识别房价预测、气温预测

3. 常见算法

  • 分类:逻辑回归、决策树、随机森林、支持向量机、神经网络
  • 回归:线性回归、岭回归、Lasso 回归、梯度提升树、神经网络

4. 实践示例:房价预测(回归)

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 加载数据
data = load_boston()
X, y = data.data, data.target# 划分训练集与测试集
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)# 评价
print("MSE:", mean_squared_error(y_test, y_pred))

二、无监督学习 (Unsupervised Learning)

1. 定义

无监督学习是指在 只有输入数据 (X) 而没有标签 (Y) 的情况下,模型需要从数据中自动发现潜在结构或模式。


2. 常见任务

  • 聚类 (Clustering)
    将数据点自动分组,示例:客户分群
  • 降维 (Dimensionality Reduction)
    从高维数据中提取低维表示,示例:PCA 用于数据可视化
  • 异常检测 (Anomaly Detection)
    识别数据中的“异常点”,示例:信用卡欺诈检测

3. 常见算法

  • 聚类:K-Means、层次聚类、DBSCAN
  • 降维:PCA、t-SNE、AutoEncoder
  • 异常检测:孤立森林、One-Class SVM

4. 实践示例:K-Means 聚类

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans# 生成数据
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=42)# K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X')
plt.show()

三、对比总结

特点监督学习无监督学习
标签有标签 (X, Y)无标签 (X)
任务分类、回归聚类、降维、异常检测
目标学习输入到输出的映射发现数据内在结构
示例垃圾邮件分类、房价预测客户分群、图像压缩

四、进阶实践建议

  1. 监督学习实战:用 scikit-learnPyTorch 做图像分类(MNIST 手写数字)。
  2. 无监督学习实战:对高维数据(如图像特征)用 PCA + KMeans 进行聚类。
  3. 半监督学习:结合少量标签数据和大量无标签数据。

五、对比示例项目

import numpy as np
import matplotlib.pyplot as plt
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, confusion_matrix
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA# 1. 加载数据
iris = load_iris()
X, y = iris.data, iris.target# ---------------------------------------------------------
# 2. 监督学习:逻辑回归分类
# ---------------------------------------------------------
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)print("监督学习分类准确率:", accuracy_score(y_test, y_pred))
print("监督学习混淆矩阵:\n", confusion_matrix(y_test, y_pred))# ---------------------------------------------------------
# 3. 无监督学习:KMeans 聚类
# ---------------------------------------------------------
kmeans = KMeans(n_clusters=3, random_state=42)
y_kmeans = kmeans.fit_predict(X)print("\nKMeans 聚类结果(与真实标签对齐情况):")
print("混淆矩阵:\n", confusion_matrix(y, y_kmeans))# ---------------------------------------------------------
# 4. 可视化对比 (PCA降维到2D)
# ---------------------------------------------------------
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)fig, axes = plt.subplots(1, 2, figsize=(12, 5))# 监督学习结果(真实标签)
axes[0].scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')
axes[0].set_title("真实标签 (Supervised Truth)")# 无监督学习结果(KMeans)
axes[1].scatter(X_pca[:, 0], X_pca[:, 1], c=y_kmeans, cmap='viridis')
axes[1].scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X')  # 聚类中心
axes[1].set_title("KMeans 聚类结果 (Unsupervised)")plt.show()

运行结果分析

  1. 监督学习分类

    • 准确率通常在 95%+,因为 Iris 数据集比较简单。
    • 模型利用了标签信息,所以预测效果很好。
  2. 无监督学习聚类

    • 聚类会输出 3 个类别,但类别编号不一定和真实标签一一对应(可能需要手动匹配)。
    • KMeans 大致能把 2 个类别分开,但可能会混淆一部分样本。

http://www.dtcms.com/a/338229.html

相关文章:

  • PCIe ASPM详解
  • 14.Linux线程(2)线程同步、线程安全、线程与fork
  • 【秋招笔试】2025.08.17大疆秋招机考第一套
  • plantsimulation知识点25.8.18-从一个RGV到另一台RGV,工件长度和宽度方向互换
  • pytest测试框架之基本用法
  • GPT-5之后:当大模型更新不再是唯一焦点
  • 本地搭建dify+deepseek智能体
  • 【unitrix数间混合计算】3.1 零标记trait(zero.rs)
  • 【最后203篇系列】033 Mongo副本集修复过程
  • Maven resources资源配置详解
  • 小程序被爬虫攻击,使用waf能防护吗?
  • Vision Master的C#脚本与opencv联合编程
  • 【opencv-Python学习笔记(7):图像平滑处理】
  • 【图像算法 - 17】慧眼识“果”:基于深度学习与OpenCV的苹果智能检测系统(附完整代码)
  • sqli-labs通关笔记-第54关 GET字符型注入(单引号闭合 限制10次探测机会)
  • 英特尔公司Darren Pulsipher 博士:以架构之力推动政府数字化转型
  • 【leetcode】392. 判断子序列
  • 【yocto】为什么要选择yocto?
  • leetcode4_452 and 763
  • 力扣热题100------19.删除链表的倒数第N个结点
  • 【MongoDB与Python:数据库操作入门教程】
  • 力扣hot100:移动零问题的巧妙解决:双指针与原地交换策略(283)
  • ETL中统一调度的方式
  • Vue深入组件:组件事件详解1
  • 如何使用 React 101 的 Highcharts 包装器
  • 【网络安全实验报告】实验七:简单的防火墙搭建实验
  • css word-pass
  • 数据转换细节揭秘:ETL如何精准映射复杂业务逻辑
  • 专题:2025AI技术应用与发展报告|附600+份报告PDF、数据仪表盘汇总下载
  • 前端处理导出PDF。Vue导出pdf