10
降维:PCA / t-SNE / UMAP
Dimensionality Reduction
高维数据看不见摸不着。降维就是"给数据拍扁照"——把 100 维压到 2~3 维,主要信息还在,能画出来。
PCA 主成分分析
论找方差最大的方向
PCA 找一组正交方向,使得数据投影上去方差最大(方差大 = 信息多)。第一个主成分是方差最大方向,第二个和第一个正交、方差次大……数学上就是对协方差矩阵做特征值分解,特征值大的方向就是主成分。累计方差贡献率:取前 k 个主成分保留了多少信息。
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
iris = load_iris()
X = iris.data
scaler = StandardScaler()
X_s = scaler.fit_transform(X)
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X_s)
print("各主成分方差贡献:", pca.explained_variance_ratio_)
# [0.7277 0.2303] 两个主成分保留了 95.8% 的信息
print("累计方差:", pca.explained_variance_ratio_.sum())
# 累计方差:0.958
t-SNE:可视化神器
论保留局部相似性
PCA 保全局方差,t-SNE 保局部距离:高维里相似的点在低维里也靠近。画出来的簇特别漂亮,但计算慢、只用于可视化、不要拿它做特征输入下游模型。perplexity(困惑度):考虑多少个近邻,常用 5~50。
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, random_state=42)
X_tsne = tsne.fit_transform(X_s)
# 然后 plt.scatter(X_tsne[:,0], X_tsne[:,1], c=y)
PCA 可视化:鸢尾花 4 维压到 2 维
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
iris = load_iris()
X_s = StandardScaler().fit_transform(iris.data)
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X_s)
plt.figure(figsize=(8,6))
for i, name in enumerate(iris.target_names):
plt.scatter(X_2d[iris.target==i, 0], X_2d[iris.target==i, 1],
label=name, alpha=0.7)
plt.xlabel(f"PC1 ({pca.explained_variance_ratio_[0]:.1%})")
plt.ylabel(f"PC2 ({pca.explained_variance_ratio_[1]:.1%})")
plt.legend()
plt.title("鸢尾花 PCA 降维可视化")
plt.show()
# 三个类别在 2D 图上分得很开,说明前两个主成分已经抓住了主要差异
t-SNE 参数怎么调
| 参数 | 说明 |
|---|---|
| perplexity(困惑度) | 考虑多少个近邻。小数据用 5~10,大数据用 30~50。常用 30。 |
| learning_rate | 学习率,常用 200。太小会聚成一个球,太大散成星。 |
| n_iter | 迭代次数,至少 1000。 |
其他降维
| 方法 | 说明 |
|---|---|
| LDA | 有监督降维,找"类别间距离最大、类别内距离最小"的方向。 |
| NMF | 非负矩阵分解,把矩阵拆成非负基×系数,可解释。 |
| UMAP | 比 t-SNE 快,能处理更大数据,保留更多全局结构。 |
本章面试题
面试 · 降维
Q1. PCA 为什么要先标准化?
查看答案
PCA 找方差大的方向,量纲大的特征方差天然大,会被误认为"信息多"。标准化后每特征方差都是 1,公平比较。
Q2. PCA 和 LDA 区别?
查看答案
PCA 无监督,找最大方差方向;LDA 有监督,找最能分开类别的方向。
Q3. t-SNE 能当预处理吗?
查看答案
不建议。t-SNE 是可视化工具,变换不可逆,且每次随机结果不同,不适合作为下游模型输入。