第 8 课
← 返回系列列表

Lecture 15-16:聚类与降维

Stanford CS229 — 斯坦福机器学习

K-Means、EM 算法、PCA 主成分分析。

Lecture 15-16:聚类与降维

课程简介

K-Means、EM 算法、PCA 主成分分析。

🎬 本课程视频:Stanford CS229 — 斯坦福机器学习


一、K-Means 聚类

1.1 算法步骤

K-Means 是最经典的聚类算法。目标是将样本划分为 K 个簇,使得簇内样本相似度最大。

算法流程:
1. 随机初始化 K 个聚类中心 $\mu_1, \mu_2, ..., \mu_K$
2. 重复以下步骤直到收敛:
a. 分配步骤:计算每个样本到各聚类中心的距离,分配到最近的簇
b. 更新步骤:重新计算每个簇的中心(簇内样本均值)

分配步骤:

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

更新步骤:

$$\mu_k = \frac{1}{m_k} \sum_{i: c^{(i)}=k} x^{(i)}$$

1.2 失真函数

K-Means 优化的是以下失真函数(Distortion Function):

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

它衡量所有样本到其所属簇中心的距离平方和。

1.3 K-Means++ 初始化

不好的初始化可能导致 K-Means 陷入局部最优。K-Means++ 的初始化策略:
1. 随机选择第一个中心点
2. 对每个点,计算到最近已选中心的距离 $D(x)$
3. 以概率正比于 $D(x)^2$ 选择下一个中心
4. 重复直到选满 K 个中心

def kmeans_plus_plus(X, K):
    centers = [X[np.random.randint(len(X))]]
    for _ in range(1, K):
        dists = np.min([np.sum((X - c)**2, axis=1) for c in centers], axis=0)
        probs = dists / np.sum(dists)
        centers.append(X[np.random.choice(len(X), p=probs)])
    return np.array(centers)

1.4 选择 K 值

肘部法则:绘制 K 与失真函数的关系曲线,选择曲线"肘部"位置的 K 值。

轮廓系数:衡量簇内紧密度和簇间分离度的综合指标,范围 [-1, 1],越大越好。

二、EM 算法

2.1 问题设定

EM(Expectation-Maximization)算法是处理隐变量(Latent Variables)模型的核心方法。

在 K-Means 中,每个样本的簇分配 $c^{(i)}$ 是"硬"的——一个样本只能属于一个簇。而高斯混合模型(GMM) 使用"软"分配——每个样本以不同概率属于各个簇。

GMM 模型:
- $z^{(i)} \sim \text{Multinomial}(\phi)$:簇选择隐变量
- $x^{(i)} | z^{(i)} = k \sim \mathcal{N}(\mu_k, \Sigma_k)$:每个簇是高斯分布

对数似然:$\ell(\theta) = \sum_{i=1}^{m} \log \sum_{k=1}^{K} P(x^{(i)}|z^{(i)}=k; \mu_k, \Sigma_k) P(z^{(i)}=k; \phi_k)$

求和在 log 内部,无法直接求 MLE。

2.2 E 步和 M 步

E 步(Expectation Step):计算后验概率 $w_k^{(i)} = P(z^{(i)}=k | x^{(i)}; \theta)$

$$w_k^{(i)} = \frac{P(x^{(i)}|z^{(i)}=k) P(z^{(i)}=k)}{\sum_{j=1}^{K} P(x^{(i)}|z^{(j)}=j) P(z^{(j)}=j)}$$

M 步(Maximization Step):基于 $w_k^{(i)}$ 更新参数

$$\phi_k = \frac{1}{m} \sum_{i=1}^{m} w_k^{(i)}$$

$$\mu_k = \frac{\sum_{i=1}^{m} w_k^{(i)} x^{(i)}}{\sum_{i=1}^{m} w_k^{(i)}}$$

$$\Sigma_k = \frac{\sum_{i=1}^{m} w_k^{(i)} (x^{(i)} - \mu_k)(x^{(i)} - \mu_k)^T}{\sum_{i=1}^{m} w_k^{(i)}}$$

2.3 EM 算法的一般形式

EM 算法适用于任何含隐变量的模型。核心思想:

$$\ell(\theta) = \sum_{i=1}^{m} \log \sum_{z} P(x^{(i)}, z^{(i)}; \theta)$$

直接优化 $\ell(\theta)$ 困难,EM 通过迭代优化一个下界来间接最大化 $\ell(\theta)$。

E 步:用当前参数计算 $Q(\theta, \theta^{(t)}) = E_{z|x,\theta^{(t)}}[\log P(x, z; \theta)]$

M 步:$\theta^{(t+1)} = \arg\max_\theta Q(\theta, \theta^{(t)})$

2.4 EM 算法推导

Jensen 不等式:$\log E[Y] \geq E[\log Y]$(log 是凹函数)

$$\ell(\theta) = \sum_i \log \sum_z Q_i(z) \frac{P(x^{(i)}, z; \theta)}{Q_i(z)} \geq \sum_i \sum_z Q_i(z) \log \frac{P(x^{(i)}, z; \theta)}{Q_i(z)}$$

其中 $Q_i(z) = P(z|x^{(i)}; \theta^{(t)})$ 使下界紧确。

EM 算法保证了每次迭代对数似然单调不减,最终收敛到局部最优。

def gmm_em(X, K, max_iters=100):
    m, n = X.shape
    # 初始化
    phi = np.ones(K) / K
    mu = X[np.random.choice(m, K)]
    Sigma = [np.eye(n) for _ in range(K)]

    for _ in range(max_iters):
        # E-step
        w = np.zeros((m, K))
        for k in range(K):
            diff = X - mu[k]
            w[:, k] = phi[k] * np.exp(-0.5 * np.sum(diff @ np.linalg.inv(Sigma[k]) * diff, axis=1))
            w[:, k] /= np.sqrt(np.linalg.det(2 * np.pi * Sigma[k]))
        w /= w.sum(axis=1, keepdims=True)

        # M-step
        Nk = w.sum(axis=0)
        phi = Nk / m
        for k in range(K):
            mu[k] = (w[:, k:k+1] * X).sum(axis=0) / Nk[k]
            diff = X - mu[k]
            Sigma[k] = (w[:, k:k+1] * diff).T @ diff / Nk[k]
    return phi, mu, Sigma

三、主成分分析(PCA)

3.1 问题设定

PCA(Principal Component Analysis)是最常用的降维方法。目标是将 $n$ 维数据投影到 $k$ 维子空间,使得投影后的数据方差最大(或重构误差最小)。

3.2 算法步骤

数据预处理
1. 减去均值:$x^{(i)} := x^{(i)} - \mu$(中心化)
2. 可选:除以标准差(特征缩放)

计算主成分
1. 计算协方差矩阵:$\Sigma = \frac{1}{m} \sum_{i=1}^{m} x^{(i)} (x^{(i)})^T$
2. 对 $\Sigma$ 做奇异值分解(SVD):$\Sigma = U S V^T$
3. 取 $U$ 的前 $k$ 列作为投影矩阵 $U_{\text{reduce}}$

降维:$z^{(i)} = U_{\text{reduce}}^T x^{(i)}$($k$ 维表示)

重构:$x_{\text{approx}}^{(i)} = U_{\text{reduce}} z^{(i)}$(映射回原始空间)

3.3 选择 k

保留的方差比例:

$$\frac{\sum_{j=1}^{k} S_{jj}}{\sum_{j=1}^{n} S_{jj}} \geq 0.99$$

选择最小的 $k$ 使得保留方差比例达到阈值(如 99%)。

3.4 PCA 的应用

PCA 的误区:不要用 PCA 来防止过拟合——这不如正则化直接有效。PCA 的主要用途是可视化和数据压缩。

def pca(X, k):
    # 中心化
    X = X - np.mean(X, axis=0)
    # SVD
    U, S, Vt = np.linalg.svd(X, full_matrices=False)
    # 取前 k 个主成分
    U_reduce = U[:, :k]
    # 降维
    Z = X @ Vt[:k].T
    return Z, U_reduce, S

四、总结

  1. K-Means:通过迭代分配-更新进行硬聚类,选择 K 可用肘部法则
  2. EM 算法:含隐变量模型的通用框架,通过 E 步和 M 步迭代优化下界
  3. GMM:高斯混合模型的软聚类,EM 算法估计参数
  4. PCA:通过 SVD 找到数据方差最大的方向,用于降维、可视化、去噪

四、EM 算法的理论深入

4.1 收敛性证明

EM 算法保证对数似然单调递增:

$$\ell(\theta^{(t+1)}) \geq \ell(\theta^{(t)})$$

这是通过构造一个下界函数并最大化这个下界来实现的。在 E 步中构建的下界在当前的参数估计处是紧确的,而 M 步最大化这个下界,确保新的参数至少不会比旧的差。

4.2 EM 与 K-Means 的关系

K-Means 实际上是 EM 算法的一个特例——当 GMM 的协方差矩阵 $\Sigma_k = \epsilon I$($\epsilon \to 0$)时,软分配退化为硬分配,EM 退化为 K-Means。

更具体地:
- K-Means 的 E 步:将样本分配到最近的簇(硬分配)
- K-Means 的 M 步:计算每个簇的均值(软 K-Means 中的 $\Sigma_k$ 不更新)
- GMM 的 E 步:计算每个样本属于每个簇的概率(软分配)
- GMM 的 M 步:更新均值和协方差矩阵

4.3 EM 的应用场景

除了 GMM,EM 算法在以下场景中也有广泛应用:

  1. 隐马尔可夫模型(HMM):Baum-Welch 算法本质上是 EM 在 HMM 上的应用
  2. 因子分析:我们下一讲会详细展开
  3. 缺失数据处理:EM 可以在有缺失值的数据集上估计参数
  4. 主题模型:pLSA 使用 EM 算法进行参数估计

4.4 PCA 的理论拓展

概率 PCA(Probabilistic PCA):将 PCA 建模为概率模型——$x = Wz + \mu + \epsilon$,其中 $\epsilon \sim \mathcal{N}(0, \sigma^2 I)$。当 $\sigma^2 \to 0$ 时,概率 PCA 收敛到标准 PCA。

概率 PCA 的优势:
- 可以使用 EM 算法处理缺失数据
- 可以计算数据的似然,用于模型选择
- 可以通过贝叶斯方法自动选择隐变量维度 k

核 PCA:通过核技巧将 PCA 扩展到非线性空间。先通过核函数将数据隐式映射到高维特征空间,再在高维空间中做 PCA。

稀疏 PCA:找到的主成分是原始特征的稀疏线性组合,提高可解释性。

延伸阅读

← Lecture 13-14:贝叶斯方法与正则化 Lecture 17-18:因子分析与 ICA →