跳转至

无监督学习(Unsupervised Learning)

无监督学习处理的是没有标签的数据。模型需要自己发现数据中隐藏的结构和模式,主要任务包括聚类(将相似的数据分组)和降维(压缩数据维度)。


聚类 vs 降维

聚类(Clustering) 降维(Dimensionality Reduction)
目标 将数据分成若干组 减少数据的特征维度
输出 每个样本的组别标签 低维空间中的新表示
应用 用户分群、异常检测 数据可视化、去噪、加速后续算法

一、K-Means 聚类

基本思想

K-Means 是最经典的聚类算法。核心思想非常直觉:把 n 个数据点分成 K 个簇,使每个点到所属簇中心的距离之和最小。

类比

想象你要在一个城市开 3 家快递站(K=3),你希望每个居民到最近快递站的距离尽可能短。K-Means 就是帮你找到 3 个最佳站点位置的算法。

算法步骤

1. 随机选择 K 个点作为初始簇中心(质心)
2. 重复以下步骤直到收敛:
   a. 分配步骤:将每个数据点分配给距离最近的质心
   b. 更新步骤:重新计算每个簇的质心(取簇内所有点的均值)

目标函数

最小化所有样本到其所属簇中心的距离之和(又称组内平方和 / Inertia):

\[ J = \sum_{k=1}^{K} \sum_{\mathbf{x}_i \in C_k} \|\mathbf{x}_i - \boldsymbol{\mu}_k\|^2 \]

其中 \(\boldsymbol{\mu}_k\) 是第 \(k\) 个簇的质心。

如何选择 K?

K-Means 需要事先指定簇的数量 \(K\),这本身就是一个难题。常用方法:

计算不同 K 值下的组内平方和(Inertia),画出 K-Inertia 曲线。曲线上出现明显"拐点"(肘部)的位置就是合适的 K 值。

Inertia
│╲
│  ╲
│    ╲___          ← 肘部在这里,选 K=3
│        ───────
└──────────────── K
  1  2  3  4  5

衡量每个样本与所属簇的紧密程度 vs 与最近其他簇的分离程度:

\[ s(i) = \frac{b(i) - a(i)}{\max(a(i), b(i))} \]
  • \(a(i)\):样本 \(i\) 到同簇其他点的平均距离(越小越好)
  • \(b(i)\):样本 \(i\) 到最近其他簇所有点的平均距离(越大越好)
  • \(s(i) \in [-1, 1]\):越接近 1 表示聚类越好

K-Means 的局限性

局限 说明
需要预设 K 有时你不知道该分几组
只能发现球形簇 对环形、不规则形状的簇效果差
对初始值敏感 不同的初始质心可能得到不同结果
对异常值敏感 一个极端值就能大幅拉偏质心

改进方案

K-Means++:改进了初始质心的选择策略,让初始点尽量分散,大幅提升稳定性。sklearn 中默认使用 K-Means++。


二、DBSCAN(基于密度的聚类)

基本思想

DBSCAN 的核心理念与 K-Means 完全不同:一个簇就是密度足够高的区域,簇与簇之间被低密度区域分隔开。

类比

想象从太空看地球的夜景。灯光密集的区域就是城市(簇),灯光稀疏的黑暗地带就是簇之间的间隔。零星的几盏灯是偏远地区(噪声点)。

两个关键参数

  • \(\varepsilon\)(eps):邻域半径。以一个点为圆心,半径为 \(\varepsilon\) 的圆
  • MinPts:密度阈值。一个点的 \(\varepsilon\) 邻域内至少要有 MinPts 个点,才算是密集区域

三种点的分类

类型 定义 直觉
核心点 \(\varepsilon\) 邻域内有 ≥ MinPts 个点 城市中心
边界点 不是核心点,但在某个核心点的 \(\varepsilon\) 邻域内 城市郊区
噪声点 既不是核心点也不是边界点 荒郊野外

算法步骤

1. 对每个未访问的点:
   a. 计算其 ε 邻域内的点数
   b. 如果 ≥ MinPts → 标记为核心点,创建新簇
   c. 将所有密度可达的点加入该簇(递归扩展)
2. 不属于任何簇的点标记为噪声

DBSCAN vs K-Means

特性 K-Means DBSCAN
需要指定簇数? ✅ 需要 ❌ 自动发现
簇的形状 只能球形 任意形状
处理噪声 ❌ 不能 ✅ 自动识别
大小不均匀的簇 ⚠️ 可以但效果差 ⚠️ 密度差异大时有困难
高维数据 ✅ 适用 ⚠️ 距离度量退化

三、主成分分析(PCA)

基本思想

PCA 是最经典的降维方法。核心思想:找到数据方差最大的方向(主成分),将数据投影到这些方向上,用少量维度保留数据的大部分信息。

类比

想象你拍一个3D物体的照片。你要选一个角度,使照片(2D投影)尽可能保留物体的轮廓信息。PCA 就是帮你找到最佳拍照角度的方法。

数学原理

目标: 找到一组新的正交基(主成分),使数据在新基上的方差最大化。

  1. 数据中心化:将每个特征减去其均值 \(\mathbf{X} \leftarrow \mathbf{X} - \bar{\mathbf{X}}\)
  2. 计算协方差矩阵\(\mathbf{C} = \frac{1}{n-1}\mathbf{X}^T\mathbf{X}\)
  3. 特征值分解\(\mathbf{C}\mathbf{v} = \lambda\mathbf{v}\)
  4. 选取前 k 个最大特征值对应的特征向量:组成投影矩阵 \(\mathbf{W} \in \mathbb{R}^{d \times k}\)
  5. 投影\(\mathbf{Z} = \mathbf{X}\mathbf{W}\),得到 \(k\) 维新表示

保留多少维度?

通过累计方差解释比来决定:

\[ \text{累计方差比} = \frac{\sum_{i=1}^{k} \lambda_i}{\sum_{i=1}^{d} \lambda_i} \]

通常保留使累计方差比达到 95%99% 的前 \(k\) 个主成分。

方差解释比
│ ████
│ ████ ███
│ ████ ███ ██
│ ████ ███ ██ █ █ █         ← 前3个主成分已解释95%的方差
└─────────────────────── 主成分
  PC1  PC2 PC3 PC4 PC5 PC6

PCA 的局限性

局限 说明
只能捕获线性关系 对非线性结构无能为力
对尺度敏感 使用前需要标准化数据
主成分难以解释 新特征是原始特征的线性组合,物理含义不明确

四、t-SNE(t-分布随机邻域嵌入)

基本思想

t-SNE 专为高维数据可视化设计,能保持数据的局部结构,将高维数据映射到 2D 或 3D 空间。

PCA vs t-SNE

  • PCA 保持的是全局结构(大距离关系),适合降维后续处理
  • t-SNE 保持的是局部结构(邻近点关系),适合可视化

核心原理

  1. 高维空间中:用高斯分布计算数据点之间的相似度(邻近点相似度高)
  2. 低维空间中:用 t 分布计算映射后点之间的相似度
  3. 优化:最小化两个分布之间的 KL 散度,使低维表示尽可能保持高维中的邻近关系
\[ \text{Cost} = KL(P \| Q) = \sum_{i} \sum_{j} p_{ij} \log \frac{p_{ij}}{q_{ij}} \]

关键参数:困惑度(Perplexity)

  • 控制每个点关注多少个邻居
  • 小困惑度(5-10):更关注局部结构,簇更紧密
  • 大困惑度(30-50):更关注全局结构,簇更分散
  • 通常设为 5-50,需要尝试不同值

使用注意事项

t-SNE 的常见误区

  1. 不要过度解读簇的大小:t-SNE 中簇的大小可能不反映真实密度
  2. 不要过度解读簇间距离:两个簇离得远不一定意味着它们真的很不同
  3. 不适合新数据:t-SNE 没有显式的映射函数,无法对新数据点进行变换
  4. 计算较慢:时间复杂度 \(O(n^2)\),大数据集可用 UMAP 替代

五、UMAP(补充)

UMAP(Uniform Manifold Approximation and Projection)是 t-SNE 的现代替代品:

特性 t-SNE UMAP
速度 较慢 快很多
全局结构 保留较差 保留较好
可扩展性 数万样本 可处理百万级
新数据映射 ❌ 不支持 ✅ 支持
超参数 困惑度 n_neighbors, min_dist

算法选择指南

graph TD
    A[需要做什么?] -->|分组数据| B{知道有几组?}
    A -->|降低维度| C{目的是什么?}
    B -->|知道| D[K-Means]
    B -->|不知道| E{数据有噪声?}
    E -->|有| F[DBSCAN]
    E -->|没有| G[层次聚类]
    C -->|后续建模| H[PCA]
    C -->|可视化| I{数据量多大?}
    I -->|< 1万| J[t-SNE]
    I -->|> 1万| K[UMAP]