无监督学习(Unsupervised Learning)¶
无监督学习处理的是没有标签的数据。模型需要自己发现数据中隐藏的结构和模式,主要任务包括聚类(将相似的数据分组)和降维(压缩数据维度)。
聚类 vs 降维¶
| 聚类(Clustering) | 降维(Dimensionality Reduction) | |
|---|---|---|
| 目标 | 将数据分成若干组 | 减少数据的特征维度 |
| 输出 | 每个样本的组别标签 | 低维空间中的新表示 |
| 应用 | 用户分群、异常检测 | 数据可视化、去噪、加速后续算法 |
一、K-Means 聚类¶
基本思想¶
K-Means 是最经典的聚类算法。核心思想非常直觉:把 n 个数据点分成 K 个簇,使每个点到所属簇中心的距离之和最小。
类比
想象你要在一个城市开 3 家快递站(K=3),你希望每个居民到最近快递站的距离尽可能短。K-Means 就是帮你找到 3 个最佳站点位置的算法。
算法步骤¶
目标函数¶
最小化所有样本到其所属簇中心的距离之和(又称组内平方和 / Inertia):
其中 \(\boldsymbol{\mu}_k\) 是第 \(k\) 个簇的质心。
如何选择 K?¶
K-Means 需要事先指定簇的数量 \(K\),这本身就是一个难题。常用方法:
计算不同 K 值下的组内平方和(Inertia),画出 K-Inertia 曲线。曲线上出现明显"拐点"(肘部)的位置就是合适的 K 值。
衡量每个样本与所属簇的紧密程度 vs 与最近其他簇的分离程度:
- \(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\) 邻域内 | 城市郊区 |
| 噪声点 | 既不是核心点也不是边界点 | 荒郊野外 |
算法步骤¶
DBSCAN vs K-Means¶
| 特性 | K-Means | DBSCAN |
|---|---|---|
| 需要指定簇数? | ✅ 需要 | ❌ 自动发现 |
| 簇的形状 | 只能球形 | 任意形状 |
| 处理噪声 | ❌ 不能 | ✅ 自动识别 |
| 大小不均匀的簇 | ⚠️ 可以但效果差 | ⚠️ 密度差异大时有困难 |
| 高维数据 | ✅ 适用 | ⚠️ 距离度量退化 |
三、主成分分析(PCA)¶
基本思想¶
PCA 是最经典的降维方法。核心思想:找到数据方差最大的方向(主成分),将数据投影到这些方向上,用少量维度保留数据的大部分信息。
类比
想象你拍一个3D物体的照片。你要选一个角度,使照片(2D投影)尽可能保留物体的轮廓信息。PCA 就是帮你找到最佳拍照角度的方法。
数学原理¶
目标: 找到一组新的正交基(主成分),使数据在新基上的方差最大化。
- 数据中心化:将每个特征减去其均值 \(\mathbf{X} \leftarrow \mathbf{X} - \bar{\mathbf{X}}\)
- 计算协方差矩阵:\(\mathbf{C} = \frac{1}{n-1}\mathbf{X}^T\mathbf{X}\)
- 特征值分解:\(\mathbf{C}\mathbf{v} = \lambda\mathbf{v}\)
- 选取前 k 个最大特征值对应的特征向量:组成投影矩阵 \(\mathbf{W} \in \mathbb{R}^{d \times k}\)
- 投影:\(\mathbf{Z} = \mathbf{X}\mathbf{W}\),得到 \(k\) 维新表示
保留多少维度?¶
通过累计方差解释比来决定:
通常保留使累计方差比达到 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 保持的是局部结构(邻近点关系),适合可视化
核心原理¶
- 高维空间中:用高斯分布计算数据点之间的相似度(邻近点相似度高)
- 低维空间中:用 t 分布计算映射后点之间的相似度
- 优化:最小化两个分布之间的 KL 散度,使低维表示尽可能保持高维中的邻近关系
关键参数:困惑度(Perplexity)¶
- 控制每个点关注多少个邻居
- 小困惑度(5-10):更关注局部结构,簇更紧密
- 大困惑度(30-50):更关注全局结构,簇更分散
- 通常设为 5-50,需要尝试不同值
使用注意事项¶
t-SNE 的常见误区
- 不要过度解读簇的大小:t-SNE 中簇的大小可能不反映真实密度
- 不要过度解读簇间距离:两个簇离得远不一定意味着它们真的很不同
- 不适合新数据:t-SNE 没有显式的映射函数,无法对新数据点进行变换
- 计算较慢:时间复杂度 \(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]