PCA 做的事情只有一句:找一根轴,让数据在它上面的投影尽量散开。 找到第一根,再找跟它垂直的第二根里最散的,依此类推。 它之所以敢丢维度,是因为数据常常本来就没占满整个空间—— 四个特征都在描述「花有多大」,那就没必要留四份。 这一页可以亲手转轴:看在哪一个角度,投影的方差到了最大。
把数据投影到某个单位方向 上, 投影后的一维数据有多散,用方差衡量。PCA 要的就是让这个方差最大的 :
这个最大化问题有闭式解:把数据写成矩阵并做中心化 ,最优方向就是 的最大特征值对应的特征向量。第二根轴则在"与第一根垂直"的 约束下重复同一件事——所以主成分天然两两正交。
数学上两者等价: 时, 的特征值正是 , 特征向量正是 的列。但数值上不等价:
先组协方差矩阵,等于把奇异值平方了一遍 (), 条件数从 变成 。 当矩阵本身接近奇异时,最小的那几根轴会丢精度甚至变成负数。 所以 sklearn 默认走 SVD——这一页也走 SVD, 只在求 的那一步用到了 对称矩阵的特征分解。
sklearn 的 PCA 只做中心化(减均值),不做标准化。 这不是疏忽,是刻意的:标准化与否给出的是两个不同的问题。
把页面的数据集切到「鸢尾花(标准化后)」对比一下, 第 1 主成分从 92.5% 掉到 73.0%。更狠的是那个诊断实验: 只把「萼片长」的单位从厘米换成 0.1 毫米(数字乘 100, 物理含义完全没变),第 1 主成分占比立刻从 92.5% 飙到 99.98%,方向也变成几乎只指着萼片长。
保留前 k 个主成分,等价于把数据正交投影到一个 k 维子空间上, 被丢掉的部分正是垂直于该子空间的分量。丢掉的方差等于 , 所以"累计解释方差比"就是"信息保住了多少"。
但要注意:保住方差 ≠ 保住结构。 右侧「近邻保持」那一项才是更贴近实际用途的指标—— 降维后原本挨得近的点,有多少还挨着。