Skip to content

05 — 无监督学习(Unsupervised Learning)

无监督学习(Unsupervised Learning) 是在没有标签(labels)的情况下,从数据中发现隐藏结构的一类方法。与监督学习不同,我们只有输入 X,没有输出 y。目标可以是聚类(clustering)、降维(dimensionality reduction)或密度估计(density estimation)。

时间线:

  • 1901: Pearson 提出 PCA(主成分分析)
  • 1957: Lloyd 提出 K-Means 聚类算法(1982 年正式发表)
  • 2008: van der Maaten & Hinton 提出 t-SNE 可视化算法

Unsupervised Learning discovers hidden structure in data without labels. Unlike supervised learning, we only have inputs X but no outputs y. Goals include clustering, dimensionality reduction, and density estimation.

前置知识 (Prerequisites): Vol 2 线性代数(SVD、特征分解)、概率论基础 依赖库 (Dependencies): numpy, scikit-learn, matplotlib


目录 (Table of Contents)

  1. K-Means 聚类 (K-Means Clustering)
  2. PCA 主成分分析 (Principal Component Analysis) 📐
  3. t-SNE 与 UMAP
  4. 高斯混合模型 GMM (Gaussian Mixture Models)

1. K-Means 聚类 (K-Means Clustering)

1.1 问题定义 (Problem Definition)

给定数据集 {x1,x2,,xm},其中 xiRn,K-Means 的目标是将数据划分成 k 个簇(clusters),使得每个点属于离它最近的簇中心(centroid)。

1.2 算法 (The Algorithm)

K-Means 是一个迭代式算法:


Algorithm 1: K-Means 聚类

  1. 初始化:随机(stochastic /stəˈkæstɪk/)选择 k 个样本作为初始质心 {μ1,μ2,,μk}

  2. 分配步骤 (Assignment Step):每个点分配给最近的质心

    c(i)=argminjx(i)μj22
  3. 更新步骤 (Update Step):重新计算每个簇的质心

    μj=1|Cj|x(i)Cjx(i)
  4. 重复步骤 2-3,直到收敛(质心不再变化或达到最大迭代次数)


为什么 K-Means 保证收敛? 算法的目标是最小化惯性(inertia),即所有点到其所属簇中心的平方距离之和:

J=j=1kx(i)Cjx(i)μj22
  • 分配步骤中,每个点被分配给最近的质心 → J 单调不增
  • 更新步骤中,质心被更新为簇内所有点的均值 → 凸优化问题,J 单调不增

由于 J 有下界(≥ 0),且每次迭代 J 都不增加,所以算法一定收敛。

💡 理解收敛性: 但 K-Means 只能保证收敛到局部最优(local optimum),而非全局最优。不同的初始质心可能导致不同的最终结果。

1.3 局限性与改进 (Limitations & Improvements)

局限性说明改进方法
假设球形簇K-Means 假设簇是各向同性的(isotropic)使用 GMM(见第 4 节)
对初始值敏感不同的初始值可能导致不同结果K-Means++ 初始化
需要指定 k必须预先设定簇的数量肘部法则(Elbow Method)
对异常值敏感均值对异常值不鲁棒使用 K-Medoids

1.4 肘部法则 (Elbow Method)

如何选择 k?肘部法则绘制不同 k 对应的 inertia,寻找"肘部":

inertia(k)=j=1kxCjxμj22

随着 k 增大,inertia 单调下降。当下降速度突然变缓时,对应的 k 就是"肘部"——再增加簇数量收益很小。

python
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_          # 每个点的簇分配
centroids = kmeans.cluster_centers_  # 质心坐标
inertia = kmeans.inertia_        # 最终 inertia 值

2. PCA 主成分分析 (Principal Component Analysis)

2.1 核心思想 (Core Idea)

PCA 寻找数据中方差最大的方向(directions of maximum variance),将高维数据投影到低维子空间,同时尽可能保留数据的变异信息。

🔍 完整演算:协方差矩阵手算 — 4×3 数据集

📐 公式

协方差矩阵 (Covariance Matrix) 衡量数据集中每对特征之间的线性关系:

C=1n1X~X~

其中 X~=Xμ 是中心化后的数据矩阵,n 是样本数。

矩阵形式的完整定义:

C=1n1i=1n(x(i)μ)(x(i)μ)

即每个样本的外积(outer product)之和除以 (n1)


📖 参数含义

符号名称含义
XRn×d数据矩阵n 个样本,d 个特征,本例 n=4,d=3
X~中心化数据矩阵每列减去该列均值后的结果
μRd均值向量每个特征的样本均值
CRd×d协方差矩阵Cij=Cov(Xi,Xj),对称半正定矩阵
Cij协方差特征 i 与特征 j 之间的协方差;i=j 时为方差

📝 公式来源

协方差矩阵的定义来自方差概念的推广。单个特征的方差为:

Var(X)=E[(Xμ)2]=1n1i=1n(xiμ)2

将其推广到多个特征,就得到协方差矩阵:

Var(X)=E[(Xμ)(Xμ)]

矩阵 X~X~ 的每个元素 (i,j) 恰好是特征 i 和特征 j 的中心化观测值的点积,除以 (n1) 后即为协方差。

协方差矩阵是 PCA 的起点——它的特征向量指明了数据方差最大的方向,这是全书第一次出现这一核心概念。


✏️ 手算演示

给定数据集 X=[1232463694812](4 个样本,3 个特征)

Step 1: 计算列均值

μ1=1+2+3+44=2.5,μ2=2+4+6+84=5,μ3=3+6+9+124=7.5

Step 2: 中心化数据(每列减去对应均值)

X~=[1.534.50.511.50.511.51.534.5]

验证:每列之和为 0

Step 3: 计算 X~X~(外积和)

X~X~3×3 矩阵,第 (i,j) 个元素是第 i 列与第 j 列的内积:

X~X~11=(1.5)2+(0.5)2+0.52+1.52=2.25+0.25+0.25+2.25=5X~X~12=(1.5)(3)+(0.5)(1)+0.5(1)+1.5(3)=4.5+0.5+0.5+4.5=10X~X~13=(1.5)(4.5)+(0.5)(1.5)+0.5(1.5)+1.5(4.5)=6.75+0.75+0.75+6.75=15X~X~22=(3)2+(1)2+12+32=9+1+1+9=20X~X~23=(3)(4.5)+(1)(1.5)+1(1.5)+3(4.5)=13.5+1.5+1.5+13.5=30X~X~33=(4.5)2+(1.5)2+1.52+4.52=20.25+2.25+2.25+20.25=45

由对称性得 X~X~21=X~X~12=10X~X~31=15X~X~32=30。因此:

X~X~=[51015102030153045]

Step 4: 除以 (n1) 得到协方差矩阵

C=13X~X~=[5/310/3510/320/31051015][1.6673.33353.3336.6671051015]

验证:本例中 X2=2X1X3=3X1,因此 Cov(X1,X2)=2×Var(X1)=2×53=103 ✓,且 Cov(X1,X3)=3×Var(X1)=3×53=5 ✓。


🌍 实际意义

  • PCA 的基石:协方差矩阵的特征分解直接给出主成分方向。特征值最大的特征向量对应数据方差最大的方向,这就是全书第一次出现协方差矩阵的原因——它是后续所有降维技术的数学起点
  • 对角化:PCA 的本质就是找到一组正交基,使得协方差矩阵在这组基下变为对角矩阵(各特征不再相关)
  • 与 SVD 的关系C=1n1VΣΣV,右奇异向量 V 就是特征向量,奇异值的平方对应特征值

2.2 数学推导 (Mathematical Derivation) 📐

假设数据矩阵 XRm×nm 个样本,n 个特征)。

第一步:中心化(Center the data)

X~=Xμ,其中 μj=1mi=1mXij

第二步:找到最大方差方向

第一主成分 w1 是单位向量,使得投影后的方差最大:

w1=argmaxw=11mi=1m(x~(i)w)2=argmaxw=1wCw

其中 C=1mX~X~ 是协方差矩阵。

可以证明:w1C 的最大特征值对应的特征向量

第三步:通过 SVD 实现(Connection to SVD)

使用 SVD(参见 Vol 2 第 1 章第 4 节),我们不需要显式构造协方差矩阵

X~=UΣV

其中:

  • URm×m:左奇异向量
  • ΣRm×n:奇异值矩阵(σ1σ2σr>0
  • VRn×n:右奇异向量

那么协方差矩阵为:

C=1mX~X~=1mVΣΣV

PCA 的关键等价关系:

SVD 中的量PCA 中的含义
右奇异向量 V 的列主成分方向(principal components)
奇异值 σi对应方向的标准差(乘以 m
矩阵 UΣ主成分得分(principal component scores)

💡 为什么用 SVD 而不是协方差矩阵? 计算 X~X~ 会平方条件数(condition number),导致数值不稳定。SVD 直接作用于 X~,数值更稳定,且不需要在样本数很大时计算 n×n 的协方差矩阵。

2.3 PCA 算法步骤 (Algorithm Steps) 📐

  1. 中心化数据 X~=Xμ
  2. X~ 计算 SVD:X~=UΣV
  3. V 的前 k 列作为主成分方向:Wk=V[:,:k]
  4. 投影数据:Z=X~Wk=UkΣk
🔍 完整演算:PCA via SVD 手算 - 4x2 到 1D 降维

📐 公式

PCA 通过对中心化数据矩阵的 SVD 实现降维:

X~=UΣV

其中 X~Rm×n。取前 k 个右奇异向量作为主成分方向:

Wk=V[:,:k]

将数据投影到 k 维子空间:

Z=X~Wk=UkΣk

📖 参数含义

符号名称含义
X~中心化数据矩阵每列减去均值后的 m×n 矩阵,本例 m=4,n=2
URm×m左奇异向量矩阵每列是 X~X~ 的特征向量,反映样本在主方向上的关系
ΣRm×n奇异值矩阵对角元素 σi 为奇异值,σ1σ20
VRn×n右奇异向量矩阵每列是 X~X~ 的特征向量 = 主成分方向
Wk投影矩阵k 个主成分方向组成的 n×k 矩阵
ZRm×k主成分得分数据在 k 维子空间中的表示

📝 公式来源

SVD 与 PCA 的等价关系来自协方差矩阵的分解:

X~X~=(UΣV)(UΣV)=VΣΣV

因此 X~X~ 的特征分解等价于 VΣ2V,其中 Σ2 由奇异值的平方(即特征值)构成。

核心等价关系

  • V 的列 = X~X~ 的特征向量 = 主成分方向
  • σi2 = 第 i 个主成分方向上的特征值(方差贡献)
  • UΣ 的列 = 主成分得分(投影后的坐标)

为什么用 SVD 更好? 直接计算 X~X~ 会平方条件数(condition number),导致数值不稳定。SVD 直接作用于 X~,数值更稳定且更高效。


✏️ 手算演示

给定数据集 X=[12234554](4 个样本,2 个特征),目标:降至 1 维。

Step 1: 中心化数据

μ1=1+2+4+54=3,μ2=2+3+5+44=3.5X~=[21.510.511.520.5]

Step 2: 计算 X~X~

X~X~=[4+1+1+43+0.5+1.5+13+0.5+1.5+12.25+0.25+2.25+0.25]=[10665]

Step 3: 求解特征值和特征向量

特征方程:

det(X~X~λI)=det[10λ665λ]=(10λ)(5λ)36=0λ215λ+14=0(λ14)(λ1)=0λ1=14,λ2=1

奇异值:σ1=143.742σ2=1

Step 4: 求右奇异向量(主成分方向)

对于 λ1=14

[4669][v11v21]=04v11+6v21=0v11=1.5v21

v21=2,得 v11=3。归一化:v1=9+4=133.606

v1=[3/132/13][0.8320.555]

对于 λ2=1

[9664][v12v22]=09v12+6v22=0v12=23v22

v22=3,得 v12=2。归一化:v2=4+9=13

v2=[2/133/13][0.5550.832]

因此:

V=[3/132/132/133/13]

Step 5: 取第一主成分(k=1)投影到 1 维子空间

w1=v1=[3/132/13]Z=X~w1=[21.510.511.520.5][3/132/13]=113[9467][2.4971.1101.6641.942]

验证:Z=U1σ1,其中 U1U 的第一列:

U1=X~v1σ1=114[9/134/136/137/13]=[9/1824/1826/1827/182]

🌍 实际意义

  • 降维:PCA 通过 SVD 将 n 维数据投影到 k 维子空间,保留最大方差方向(kn
  • 去噪:丢弃小奇异值对应的成分相当于滤除噪声——噪声通常在各方向上均匀分布,而信号集中在大奇异值方向
  • 可视化的桥梁:SVD 分解清晰地展示了"方向"(V)、"强度"(Σ)和"样本坐标"(UΣ)三个核心元素

2.4 应用场景 (Applications)

  • 降维(Dimensionality Reduction): 用更少的特征训练模型,减少过拟合(overfitting /ˈoʊvərˈfɪtɪŋ/)
  • 可视化(Visualization): 将高维数据投影到 2D/3D 平面
  • 去噪(Noise Reduction): 丢弃小奇异值对应的成分可以滤除噪声
  • 特征工程(Feature Engineering): PCA 成分可以作为新特征

2.5 保留方差比例 (Explained Variance Ratio) 📐

i 个主成分解释的方差比例为:

ri=σi2j=1rσj2

k 个主成分累计解释的方差比例为 i=1kri。通常选择 k 使得累计方差比例达到 95%。

python
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)           # 投影到 2D
explained_ratio = pca.explained_variance_ratio_  # 每个成分解释的方差比例
components = pca.components_            # 主成分方向(V 的列)
🔍 完整演算:保留方差比例手算

📐 公式

i 个主成分解释的方差比例(Explained Variance Ratio):

ri=σi2j=1rσj2

其中 σi 是第 i 个奇异值,r=min(m,n) 是非零奇异值的个数。

k 个主成分的累计方差比例(Cumulative Explained Variance Ratio):

Rk=i=1kri=i=1kσi2j=1rσj2

📖 参数含义

符号名称含义
σii 个奇异值来自 X~=UΣVσ1σ2
σi2特征值等于协方差矩阵 C 的第 i 大特征值 λi
ri单成分方差比例i 个主成分解释的方差占总方差的比例
Rk累计方差比例k 个主成分累计解释的方差比例
r矩阵的秩非零奇异值的个数(最多 min(m,n)

📝 公式来源

协方差矩阵的迹(trace)等于总方差:

tr(C)=i=1nCii=i=1nVar(Xi)

由于协方差矩阵的特征值之和等于迹(λi=tr(C)),且 λi=σi2(忽略 n1 因子),因此:

总方差=σj2

i 个主成分贡献的方差比例即为 σi2/σj2

95% 经验法则:通常选择最小的 k 使得 Rk0.95,即保留 95% 以上的方差信息。这个阈值是降维中最常用的经验规则。


✏️ 手算演示

从 Box B 中我们已经得到奇异值:

σ1=143.742,σ2=1

Step 1: 计算总方差

σ12+σ22=14+1=15

Step 2: 计算各成分的方差比例

第一主成分:

r1=σ12σ12+σ22=14150.933(93.3%)

第二主成分:

r2=σ22σ12+σ22=1150.067(6.7%)

Step 3: 计算累计方差比例

R1=r1=14150.933(93.3%)R2=r1+r2=1415+115=1(100%)

Step 4: 降维决策

  • 若按 95% 阈值R1=93.3%<95%,需要保留 k=2 个主成分
  • 若按 90% 阈值R1=93.3%>90%,仅需保留 k=1 个主成分

🌍 实际意义

  • 降维决策:保留方差比例是选择 k 的主要依据。典型阈值 95% 意味着我们接受 5% 的信息损失来换取维度的大幅降低
  • Scree Plot:绘制 ri 的降序条形图(Scree Plot),寻找"肘部"——拐点之后的主成分贡献很小,可视为噪声
  • 低秩数据:如果前几个奇异值远大于其余,说明数据本质上是低秩的(low-rank),可以用很少的维度近似表示

3. t-SNE 与 UMAP

3.1 为什么需要非线性降维?(Why Non-linear Dimensionality Reduction?)

PCA 是线性降维方法——它假设数据的主要变化方向是线性的。但现实数据往往位于复杂的**非线性流形(non-linear manifold)**上。例如,MNIST 手写数字在 784 维空间中位于一个高度弯曲的流形上,PCA 无法将其展开。

3.2 t-SNE (t-Distributed Stochastic Neighbor Embedding)

t-SNE 是一种非线性降维方法,特别擅长可视化高维数据

核(kernel /ˈkɜːrnl/)心思想: 在高维空间中定义点之间的概率相似度,然后在低维空间中找到一个分布,使两者之间的 KL 散度(KL divergence)最小。

Pj|i=exp(xixj2/2σi2)kiexp(xixk2/2σi2)

在低维空间中,使用 t-分布(Student's t-distribution) 定义相似度(t-分布有更重的尾巴,可以避免"拥挤问题"):

Qij=(1+yiyj2)1kl(1+ykyl2)1

优化目标(最小化 KL 散度):

C=ijPj|ilogPj|iQij

3.3 UMAP (Uniform Manifold Approximation and Projection)

UMAP 是一个更新的方法,比 t-SNE 更快,且能更好地保留全局结构(global structure)

特性t-SNEUMAP
速度较慢 (O(n2))更快(基于图论优化)
全局结构主要保留局部邻域更好地保留全局结构
距离意义❌ 簇间距离无意义❌ 同样无意义
可扩展性不适合大数据集可扩展到百万级样本
理论基础概率模型基于黎曼几何和拓扑学

3.4 ⚠️ 重要警告 (Important Warnings)

t-SNE 和 UMAP 仅用于可视化(visualization ONLY),不能用于特征提取或下游模型训练。 原因:

  1. 非确定性映射: 每次运行结果不同
  2. 距离无意义: 特别是 t-SNE 中,簇之间的距离不代表高维空间中的真实距离
  3. 无法泛化到新样本: 需要重新运行整个算法
  4. 超参数(hyperparameter /ˈhaɪpərpəˈræmɪtər/)敏感: perplexity(/pərˈpleksəti/) 等参数(parameter /pəˈræmɪtər/)对结果影响很大
python
from sklearn.manifold import TSNE

tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X)  # 仅用于可视化!

4. 高斯混合模型 GMM (Gaussian Mixture Models)

4.1 从硬聚类到软聚类 (From Hard to Soft Clustering)

K-Means 是硬聚类(hard clustering)——每个点唯一地属于一个簇。但有时一个点可能"部分属于"多个簇。

高斯混合模型(Gaussian Mixture Model, GMM)软聚类(soft clustering):每个点以不同的概率属于所有簇,这些概率之和为 1。

4.2 模型定义 (Model Definition)

GMM 假设数据由 k 个高斯分布混合生成:

p(x)=j=1kπjN(xμj,Σj)

其中:

  • πj混合权重(mixing coefficient),满足 j=1kπj=1

  • N(μj,Σj) 是第 j 个高斯分布的密度函数:

    N(xμ,Σ)=1(2π)n/2|Σ|1/2exp(12(xμ)Σ1(xμ))

4.3 EM 算法直觉 (EM Algorithm Intuition)

GMM 的参数 {πj,μj,Σj}j=1k 通过期望最大化(Expectation-Maximization, EM) 算法学习。

EM 是处理隐变量(latent(/ˈleɪtənt/) variables) 问题的一般框架。在 GMM 中,隐变量 z(i) 表示样本 x(i) 来自哪个高斯成分。

E 步(E-step): 估计每个点属于每个簇的概率(责任,responsibility)

γij=p(z(i)=jx(i))=πjN(x(i)μj,Σj)l=1kπlN(x(i)μl,Σl)

M 步(M-step): 用加权最大似然估计更新参数

μj=i=1mγijx(i)i=1mγij,Σj=i=1mγij(x(i)μj)(x(i)μj)i=1mγij,πj=1mi=1mγij

💡 EM 迭代直觉: E 步做"软分配"(就像 K-Means 的分配步骤,但这里是概率形式的),M 步用加权数据更新参数(就像 K-Means 更新质心,但每个点的贡献被加权)。

4.4 GMM vs K-Means

特性K-MeansGMM
聚类类型硬聚类软聚类(概率)
簇形状球形(各向同性)椭圆(任意协方差)
参数仅质心位置均值、协方差、权重
算法Lloyd 迭代EM 算法
复杂度简单快速更慢但更灵活
python
from sklearn.mixture import GaussianMixture

gmm = GaussianMixture(n_components=3, random_state=42)
gmm.fit(X)
probs = gmm.predict_proba(X)   # 每个点属于每个簇的概率 (m × k)
labels = gmm.predict(X)         # 最可能的簇分配
means = gmm.means_              # 每个成分的均值
covars = gmm.covariances_       # 每个成分的协方差矩阵

4.5 如何选择 k?

对于 GMM,可以使用赤池信息量准则(AIC)贝叶斯信息量准则(BIC) 来选择成分数量:

AIC=2lnL^+2d,BIC=2lnL^+dlnm

其中 d 是参数数量,L^ 是最大化似然值。AIC/BIC 越小越好。


本章总结 (Chapter Summary)

方法类型核心思想输出主要应用
K-Means聚类(硬)最小化 inertia簇分配客户分群、图像分割
PCA降维(线性)最大化方差方向主成分可视化、去噪、特征提取
t-SNE / UMAP降维(非线性)保留邻域结构2D/3D 嵌入(embedding /ɪmˈbedɪŋ/)🔍 仅用于可视化
GMM聚类(软)概率混合模型概率分配密度估计、异常检测

关键概念速查 (Key Concepts)

概念含义
Inertia各点到所属簇中心的平方距离之和
Elbow Method绘制 inertia-k 曲线,选择拐点处的 k
K-Means++智能初始化(让初始质心尽可能分散)
Explained Variance Ratio每个主成分解释的方差占比 σi2/σj2
KL 散度t-SNE 的优化目标,衡量两个分布之间的差异
ResponsibilityGMM 中一个点属于某个成分的后验概率
AIC / BIC模型选择准则,平衡拟合度与复杂度

本章演算盒索引

位置演算盒跳转
§2.2🔍 协方差矩阵手算 — 4×3 数据集跳转
§2.3🔍 PCA via SVD 手算 — 4×2→1D跳转
§2.5🔍 保留方差比例手算跳转

进一步阅读 (Further Reading)


下一章预告: 模型评估与选择 — 交叉验证、偏差-方差权衡、ROC 曲线,用严谨的方法论评估 ML 模型。

参考文献 (References)

  1. Pearson, K. (1901). On lines and planes of closest fit to systems of points in space. Philosophical Magazine, 2(11), 559–572. — PCA 的首次提出。
  2. Lloyd, S. P. (1982). Least squares quantization in PCM. IEEE Trans. Inform. Theory, 28(2), 129–137. — K-Means 算法。
  3. van der Maaten, L. & Hinton, G. (2008). Visualizing data using t-SNE. JMLR, 9, 2579–2605. — t-SNE 的提出。