3、PCA的几何解释:旋转、缩放与投影

很多人学PCA,上来就背公式——特征向量、特征值、协方差矩阵,背得滚瓜烂熟。但问一句“这玩意儿到底在干嘛?”就卡住了。

我个人习惯,先从几何角度理解。说白了,PCA的本质就三步:旋转、缩放、投影。你搞懂了这三步,后面什么方差解释率、主成分载荷,全都是顺理成章的事。

从“旋转坐标轴”讲起

想象一下,你有一堆数据点,它们可能长成一个椭球形状,斜着躺在坐标系里。比如两个特征X1和X2,数据分布像一颗鸡蛋。

为什么是鸡蛋?因为变量之间往往有相关性。相关性意味着数据不是均匀散开的,而是沿着某个方向拉长。我刚开始做数据处理时,总是盯着散点图看半天,后来发现——你只需要找到那个“鸡蛋”的长轴方向,一切就清晰了。

PCA的核心直觉:数据在哪条轴上方差最大,那条轴就承载了最多的信息。旋转坐标轴,让新轴指向方差最大的方向——这就是第一主成分。

三步拆解:我亲自画一遍

咱们一步步拆开来看。假设你有原始数据矩阵 \( X \)(m个样本,n个特征)。

  1. 旋转(找方向)
    用协方差矩阵的特征向量,把坐标轴旋转到数据的主方向上。相当于你拿着一把尺子,顺着“鸡蛋”的长轴、短轴去对齐。
    注意:旋转不改变数据本身的相对位置,只是换了个角度看。
  2. 缩放(拉平方差)
    旋转之后,每个新轴上的方差可能不一样大。特征值告诉我们每个主成分有多“重要”。这一步里,我们用特征值的平方根去缩放坐标轴,让每个新轴上的方差变成1。
    我见过不少人忽略了缩放的意义——如果不缩放,后续计算距离时,方差大的轴会主导结果。要不要缩放,取决于你的目标。
  3. 投影(扔掉噪声)
    选前k个主成分,把数据投影上去。其他轴上的信息,当作噪声丢掉。降维就这么简单。
    举个例子,我做过一个100维的基因表达数据,投影到前3个主成分上,聚类结果反而比原始100维更清楚——因为噪声被扔掉了。

说白了,PCA就是把你原本的坐标系“摆正”,然后挑出最亮眼的几个方向,剩下的忽略不计。

代码验证一下

不扯虚的,自己动手跑一遍比什么都强。下面是我用NumPy手写的PCA几何步骤,每一步都对应上面的解释。

import numpy as np

# 随机生成一些二维数据,故意让它们有相关性
np.random.seed(42)
X = np.random.randn(100, 2)
X[:, 1] = 0.7 * X[:, 0] + 0.3 * X[:, 1]  # 制造相关性

# Step 1: 数据中心化
X_centered = X - X.mean(axis=0)

# Step 2: 计算协方差矩阵
cov = np.cov(X_centered.T)

# Step 3: 特征分解 → 得到旋转方向(特征向量)和缩放因子(特征值)
eigvals, eigvecs = np.linalg.eig(cov)
# 按特征值从大到小排序
idx = np.argsort(eigvals)[::-1]
eigvecs = eigvecs[:, idx]
eigvals = eigvals[idx]

# Step 4: 旋转:把数据映射到主成分方向
X_rotated = X_centered @ eigvecs

# Step 5: 缩放:用特征值标准化(白化步骤,可选)
X_whitened = X_rotated / np.sqrt(eigvals)

# Step 6: 投影:只保留前1个主成分
k = 1
X_projected = X_rotated[:, :k]

print("原始形状:", X.shape)
print("降维后形状:", X_projected.shape)

你看,从`X_rotated`到`X_whitened`,就是缩放步骤。从`X_rotated`切出前1列,就是投影步骤。如果我想还原到原始空间,只需要逆变换——这东西在Sklearn里叫`inverse_transform`,原理就是反着做一遍。

重点提醒:关于“缩放”的两个常见误解

误解真相
缩放步骤一定是必须的不一定。如果你只做降维,不需要标准化距离,那么可以跳过缩放。PCA的旋转+投影就已经变了坐标系,缩放是为了让每个主成分的方差一致。
旋转方向不重要重要!特征向量的正负号只是方向相反,但本质上表示同一条直线。不过,我曾因为忽略了符号一致性,导致结果和书本上的主成分载荷差了一个负号,排查了半天。

我曾经踩过一个坑:对高维稀疏数据直接做PCA,结果前几个主成分的方差非常接近,几乎分不出主次。后来发现,那是数据没有标准化,导致方差大的特征主导了旋转方向。所以,先标准化再做PCA,是个好习惯。

核心流程图:PCA的几何变换全过程

下面这张图把所有步骤串在一起,从原始数据到降维结果,每一步都有明确的几何含义。

PCA几何变换流程 原始数据 数据中心化 旋转坐标轴 缩放方差 投影到前k个 降维结果 说明: 旋转改变坐标系方向,缩放调整各轴尺度,投影丢弃低方差维度。 三者配合实现维度的压缩和信息损失的最小化。

几个重要结论

  • PCA的旋转方向就是协方差矩阵的特征向量方向,互相垂直——这也是为什么主成分之间零相关。
  • 特征值的大小决定了该主成分的“重要性”。特征值越大,那个方向上的方差越大,保留的信息越多。
  • 如果你只做旋转,不做投影——那等于换了个坐标系,纬度不变。真正降维的是“投影”这一步。

我自己做PCA可视化时,最喜欢先投影到前两个主成分上,看一眼数据长什么样。如果前两个主成分能解释80%以上的方差,那说明结构很简单。如果只有50%,说明数据比较散——嗯,这时候我会先怀疑标准化是不是出问题了。