第 8 课
← 返回系列列表

第8周:无监督学习

吴恩达机器学习 (2014) — 交互式学习笔记

K-Means 聚类、PCA 主成分分析、数据降维与可视化。

第8周:无监督学习

课程简介

K-Means 聚类、PCA 主成分分析、数据降维与可视化。

🎬 本课程视频:吴恩达机器学习 (2014) — 交互式学习笔记


一、无监督学习概述

1.1 有监督学习与无监督学习的区别

前 7 周我们都在处理监督学习问题——训练数据有标签 y。这周我们转向无监督学习——训练数据只有特征 x,没有标签 y。模型的目标是发现数据中隐藏的结构和模式。

无监督学习的主要任务:
- 聚类(Clustering):将相似数据点自动分组
- 降维(Dimensionality Reduction):将高维数据压缩到低维空间
- 密度估计(Density Estimation):估计数据的概率分布
- 异常检测(Anomaly Detection):识别远离大多数样本的异常点

1.2 无监督学习的应用场景

聚类:市场客户分群、社交网络分析、天文数据分析、图像压缩。
降维:数据可视化(将高维数据映射到 2D/3D 作图)、数据压缩、加速后续监督学习。

二、K-Means 聚类算法

2.1 K-Means 算法步骤

K-Means 是最经典、最常用的聚类算法。它的目标是将数据划分为 K 个簇,使得每个数据点属于距离它最近的簇中心。

算法流程:
1. 初始化:随机选择 K 个数据点作为初始簇中心
2. 重复以下步骤直到收敛
a. 分配步骤:对每个样本 x^{(i)},计算它到所有簇中心的距离,将其分配到最近的簇
b. 更新步骤:对每个簇 k,重新计算簇中心为簇内所有样本的均值

数学表述:

分配:$$c^{(i)} = \arg\min_k |x^{(i)} - \mu_k|^2$$

更新:$$\mu_k = \frac{1}{|C_k|} \sum_{i \in C_k} x^{(i)}$$

2.2 K-Means 的代价函数(失真函数)

$$J(c, \mu) = \frac{1}{m} \sum_{i=1}^{m} |x^{(i)} - \mu_{c^{(i)}}|^2$$

这个函数度量所有样本到各自簇中心的平均距离平方和——称为失真函数。K-Means 的交替分配-更新过程实际上是在坐标下降法优化这个代价函数——分配步骤优化 c,更新步骤优化 μ。

由于 K-Means 的本质是优化一个代价函数,所以算法保证会收敛——但可能收敛到局部最优而非全局最优。

2.3 随机初始化策略

K-Means 对初始簇中心的位置很敏感。不好的初始化可能导致收敛到糟糕的局部最优。

推荐的做法:
1. 从训练集中随机选择 K 个不同的样本作为初始簇中心
2. 运行 K-Means 多次(50-1000 次),每次不同的随机初始化
3. 选择其中失真函数最小的结果

注意:当 K 很小(如 2-10)时,多次初始化能显著改善结果。

2.4 如何选择 K

K 是 K-Means 最关键的参数——你需要预先指定簇的数量。

肘部法则(Elbow Method)
绘制 K 与失真函数的关系曲线。随着 K 增大,失真函数会下降。如果曲线有清晰的肘部——在某个 K 之后下降速度显著放缓——这个 K 就是好的选择。

但现实数据中肘部往往并不明显。在这种情况下,更好的方法是从实际应用需求出发:例如在 T 恤尺寸分类中,你决定做 S/M/L 三个尺寸还是 XS/S/M/L/XL 五个尺寸——这取决于业务需求。

from sklearn.cluster import KMeans

distortions = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, init='k-means++', n_init=10, random_state=42)
    kmeans.fit(X)
    distortions.append(kmeans.inertia_)

三、主成分分析(PCA)

3.1 数据降维问题

数据降维的目标是找到一个低维表示,在尽可能保留原始信息的前提下压缩数据。

实际应用:
1. 可视化:将高维数据降到 2D 或 3D 进行可视化
2. 数据压缩:减少存储空间和后续计算成本
3. 去噪:低维表示可以过滤掉高维噪声
4. 加速监督学习:用降维后的低维数据训练模型可以显著加快训练速度

3.2 PCA 的核心思想

主成分分析(PCA)是最常用的线性降维算法。

PCA 的目标是:找到一个低维主方向,使得将数据投影到这些方向上时,投影误差(点到投影的距离平方和)最小。

数学上,PCA 找的是数据协方差矩阵的前 K 个最大特征值对应的特征向量——这些特征向量就是数据变化最大的方向。

3.3 PCA 算法步骤

  1. 数据预处理:对所有特征进行均值归一化和特征缩放
  2. 计算协方差矩阵:Σ = (1/m) Xᵀ X
  3. 计算协方差矩阵的特征向量:使用奇异值分解(SVD)
  4. 选择前 K 个主成分:选择最大的 K 个特征值对应的特征向量
  5. 将数据投影到低维空间:z = U_reduceᵀ x
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

pca = PCA(n_components=2)
Z = pca.fit_transform(X_scaled)

3.4 选择主成分的数量 K

如何选择 K?保留足够多的主成分,使得投影后的数据保留了足够多的方差。

常见阈值:
- 保留 95% 方差:适合大多数场景
- 保留 99% 方差:适合对信息损失敏感的任务
- 降到 2D/3D:专门用于可视化

3.5 从压缩数据重建

从低维表示 z 可以重建回原始高维空间的近似值:

$$x_{approx} = U_{reduce} \cdot z$$

重建误差就是原始数据与重建数据之间的差距。PCA 选择的主成分就是最小化这个重建误差的方向。

3.6 PCA 的常见误用

  1. 用 PCA 防止过拟合:这是错误的。PCA 通过丢弃一些信息来降维——它丢弃的是方差最小的方向,而方差小的方向不一定与目标标签 y 无关。更好的防止过拟合方法是正则化。

  2. 在不必要的时候使用 PCA:如果原始数据不需要降维就能很好地训练模型——就不要使用 PCA。先用原始数据训练模型,只有在计算资源或存储成为瓶颈时才考虑用 PCA。

  3. 将 PCA 作为预处理默认步骤:Andrew Ng 强调:在确认机器学习算法在原始数据上无法运行之前,不应该自动使用 PCA。

四、K-Means 与 PCA 的对比

特性 K-Means PCA
类型 聚类 降维
目标 将样本分为 K 组 找到方差最大的方向
输入 X, K X, K
输出 簇标签 低维表示
适用场景 市场分群、图像分割 可视化、压缩、去噪

第 8 周我们从监督学习进入了无监督学习的领域。K-Means 是聚类算法中最简单也最实用的一个——理解它的分配-更新迭代过程就掌握了聚类分析的核心思想。PCA 是数据降维的标准工具——它通过寻找方差最大的方向来保留数据中的主要结构。这两个算法在实际项目中应用广泛——K-Means 用于数据探索和预处理,PCA 用于可视化和加速后续模型训练。

K-Means 收敛性证明

K-Means 保证收敛,但只收敛到局部最优,不保证全局最优。收敛性证明基于一个事实:分配步骤和更新步骤各自都会减小失真函数 J。

分配步骤中,每个样本被分配到最近的簇中心——距离必然不大于之前距离,因此 J 不会增大。
更新步骤中,簇中心更新为簇内样本均值——可以证明均值最小化到所有点的距离平方和,因此 J 不会增大。

由于 J 有下界(大于等于 0),且单调下降,算法必然收敛。

K-Means++ 初始化算法

K-Means++ 改进的初始化算法大大降低了 K-Means 对初始值的敏感性:

  1. 从数据中随机选择一个点作为第一个簇中心
  2. 对于每个数据点 x,计算它到最近簇中心的距离 D(x)
  3. 以正比于 D(x)² 的概率选择一个新的簇中心
  4. 重复步骤 2-3 直到选出 K 个簇中心

这种初始化方式使得簇中心更加分散,避免了多个初始簇中心挤在一起的问题。

def kmeans_plus_plus(X, K):
    n_samples = X.shape[0]
    centers = [X[np.random.randint(n_samples)]]

    for _ in range(1, K):
        dists = np.array([min(np.sum((x - c) ** 2) for c in centers)
                          for x in X])
        probs = dists / dists.sum()
        new_center = X[np.random.choice(n_samples, p=probs)]
        centers.append(new_center)

    return np.array(centers)

PCA 与特征选择的对比

PCA 和特征选择是两种完全不同的降维策略:

特征选择:从原始特征中选出最有用的子集
- 优点:可解释性强,保留原始特征的含义
- 缺点:可能丢失特征交互信息

PCA:将原始特征线性组合成新特征
- 优点:保留了最多方差,新特征互不相关
- 缺点:可解释性差,新特征没有直接含义

在实践中,如果可解释性很重要(如医疗诊断),优先使用特征选择。如果只是想压缩数据或加速训练,PCA 通常效果更好。

PCA 用于数据可视化

PCA 最广泛的应用之一是将高维数据降到 2D 或 3D 进行可视化。这可以帮助:

  1. 理解数据的内在结构——是线性可分还是非线性
  2. 检测异常值和离群点
  3. 验证特征工程的效果——不同类别的样本在新的 2D 空间是否分离
  4. 向非技术人员展示数据的直观视图

K-Means 的应用示例

K-Means 在图像压缩中的应用:对于一张图片,每个像素有三个颜色值(RGB)。将像素颜色作为数据点运行 K-Means(K=16),得到 16 个簇中心颜色。然后将每个像素替换为最近的簇中心颜色——图片的颜色数从 1600 万种压缩到 16 种,但整体视觉效果变化不大。

这种图像压缩方法可以大幅减少存储空间——每像素从 24 位降到了 4 位。

降维的动机与维度灾难

维度灾难(Curse of Dimensionality)是指随着特征维度的增加,数据在空间中变得极其稀疏的现象。在高维空间中:
1. 几乎所有点之间的距离都非常大且彼此接近——距离度量失去意义
2. 需要指数级增加的样本量才能达到同样的样本密度
3. 过拟合风险急剧增加

降维的两个主要动机:
- 数据压缩:减少存储空间,加速后续算法
- 数据可视化:将高维数据降到 2D 或 3D 便于理解

但降维也有风险:可能丢失重要信息、产生不可解释的新特征(尤其是 PCA)。

PCA 的数学推导

PCA 寻找使投影方差最大的方向。从数学上看,第一个主成分的方向是协方差矩阵 Σ = (1/m)XᵀX 的最大特征值对应的特征向量。

算法步骤:
1. 对数据进行零均值化(减去均值)
2. 计算协方差矩阵 Σ = (1/m)XᵀX
3. 对 Σ 进行奇异值分解 [U, S, V] = svd(Σ)
4. 取 U 的前 k 列作为投影矩阵 U_reduce
5. 降维后的数据:z = U_reduceᵀ · x

选择 k 的方法:保留方差比例 = ΣS_ii / ΣΣS_jj(前 k 个奇异值的平方和与所有奇异值的平方和之比),通常选择 0.99(保留 99% 方差)。

PCA 的误用与正确用法

PCA 最常见的误用是作为防止过拟合的手段。虽然降维后模型参数少了,似乎可以防止过拟合——但它丢弃了部分信息,而且没有利用标签信息。如果担心过拟合,应该优先使用正则化,而不是 PCA。

PCA 的正确使用场景:
- 数据可视化(降维到 2D/3D)
- 存储和计算效率提升(压缩数据)
- 去噪(小的奇异值对应噪声)
- 特征独立化(主成分之间互不相关)

不要默认使用 PCA——先用原始数据训练模型,确定确实需要加速或降维后再加入 PCA。

延伸阅读

← 第7周:支持向量机 第9周:异常检测与推荐系统 →