草稿
主成分分析
通过把中心化数据旋转到变化最大的方向,压缩一张数据表。
问题:表格比真正的模式更宽
想象一张很小的身体测量表。height 和 arm span 是两个不同列,但在这个固定样例里,它们大多一起变大。每一行有两个数,可肉眼看到的主要模式接近一条倾斜方向。
这就是 PCA 要修补的痛点:保留重要变化,但不必保留每一个原始列。
| 样本 | 身高 | 臂展 |
|---|---|---|
| A | 156 | 153 |
| B | 160 | 160 |
| C | 164 | 164 |
| D | 168 | 173 |
| E | 172 | 176 |
| F | 176 | 182 |
第一个朴素想法:删掉一个原始列
一个诱人的压缩规则是:“保留扩散更大的列”,或者“删掉看起来重复的列”。这个规则很便宜,但可能丢掉共同的斜向变化。如果身高和臂展一起变化,任何一个原始轴都不一定是最好的单维总结。
平方重构误差总和。臂展被替换为这一列的均值。
平方重构误差总和。身高被替换为这一列的均值。
平方重构误差总和。一个旋转后的坐标跟随共同变化。
图中的条形都使用同一个固定样例。保留 PC1 的平方重构误差更低,因为这个坐标是旋转后的混合方向,不只是 height,也不只是 arm span。
痛点:信号是倾斜的
有用的线斜着穿过中心化后的点云。原始列只能测水平或竖直方向的“影子”;PCA 允许先把测量线旋转过去。
这是由最大投影方差选出的单位方向,明显是斜向的,但不是强行设为 45 度。
核心发明:中心化、旋转、保留
主成分分析(Principal Component Analysis,PCA)做三件小事:
- 对每个特征列减去它的均值,也就是中心化。
- 找到让中心化点投影方差最大的单位方向。
- 保留前几个旋转后的坐标,丢掉较安静的方向。
PCA 是无监督的(unsupervised):它忽略标签和目标值。PCA 也是线性的(linear):每个主成分(principal component)都是原始特征的加权混合。因为它测量数值扩散,PCA 对特征尺度很敏感。
中心化切换
均值向量: (166, 168); 当前均值: (166, 168); 中心化后均值: (0, 0)
中心化把点云移到均值附近,让 PCA 测量围绕中间的扩散,而不是离原点有多远。
进入公式前的词汇桥
- 方差(variance)表示投影后的点沿一条线有多分散。
- 单位方向(unit direction)是一支长度为 1 的箭头,避免长箭头只因为更长而胜出。
- 投影(projection)是点落到某条线上的影子。
- 正交(orthogonal)表示成直角;后面的主成分必须看向新的直角方向。
- 协方差(covariance)概括哪些特征值会一起升高或降低。
- 特征向量(eigenvector)是一个被协方差拉伸但不会被转弯的方向。
- 线性混合(linear mixture)是把旧特征按权重加起来的新特征,比如“一部分身高加一部分臂展”。
方差扫描
投影方差: 144.61 / 144.62 PC1 最大值
PCA 测试单位方向,并选择投影坐标最分散的那一条。
投影方差
形式化记号
设 n 是行数,d 是原始特征数,k 是保留的主成分数。X 表示原始的 n x d 表格,mu 表示特征均值向量,X_c 表示中心化后的表格,W_k 表示前 k 个主方向,Z 表示压缩后的坐标。
n x d
减去特征均值
d x k
投影到方向上
展开并加回均值
先中心化表格:
直白解释:减去每个特征的平均值,让 PCA 研究围绕点云中心的扩散。
再概括特征如何一起变化:
直白解释:协方差概括共同变化。有些库会用 1/(n-1) 而不是 1/n;这不改变本页的方向直觉。
选择第一个方向:
直白解释:尝试单位方向,选择投影后点最分散的那一条。
主方向满足:
直白解释:每个主方向都是协方差的稳定方向,lambda_j 是这个方向承载的方差。
压缩并重构:
直白解释:把每一行替换成保留方向上的坐标,再展开这些坐标并把均值加回去,得到近似表格。
第 j 个主成分承载的总扩散比例是:
追踪实验台:算法状态
PCA 追踪实验台
步骤 1/6: 原始表格. 两个测量值大多一起上升,所以表格比真正的模式更宽。
2 个原始列
| A | 156, 153 |
|---|---|
| B | 160, 160 |
| C | 164, 164 |
| D | 168, 173 |
实现草图
const mu = columnMeans(X);
const Xc = subtractColumnMeans(X, mu);
const C = multiply(transpose(Xc), Xc).scale(1 / X.length);
const components = eigenvectorsSortedByEigenvalue(C);
const Wk = components.slice(0, k);
const Z = multiply(Xc, Wk);
const Xhat = addColumnMeans(multiply(Z, transpose(Wk)), mu);
这段代码对应追踪实验台中的状态:原始表、中心化表、协方差、主成分、投影编码、重构。实际库常常直接在 X_c 上使用 SVD、截断 SVD,或在只需要少量主成分时使用随机化方法。
正确性直觉
中心化之后,PC1 是投影方差最大的单位方向。PC2 与 PC1 正交,并捕捉剩余方向中最大的方差。继续下去,就得到一组互成直角、按扩散程度从大到小排列的方向。
在保留主成分数量固定时,这个顺序也会在线性投影里最小化平方重构误差。直觉上,如果一个方向上的中心化扩散很大却被丢掉,许多点都需要很长的重构修正。
重构对比
保留 PC1: 平方误差总和 2.29. 一个旋转后的坐标跟随共同变化。
条形图显示原始、未标准化二维特征空间中的平方重构误差总和。
臂展被替换为这一列的均值。
身高被替换为这一列的均值。
一个旋转后的坐标跟随共同变化。
两个 PCA 坐标可以重建原始的二维表。
复杂度
每个表格项都处理一次
跨行比较每一对特征
特征数变大时常常昂贵
每一行乘以 k 个方向
行数更多时,主要会让扫描和投影步骤变长。特征数更多时,协方差和完整特征分解可能增长得更快,因为特征对和 d x d 矩阵会主导计算量。
常见混淆
PCA 常见混淆
PCA 不是弯曲流形方法(curved-manifold method)。如果数据躺在弯曲表面上,PCA 只能选择一个平直的线性视角;Isomap 或邻居嵌入方法问的是另一类问题。
图谱连接
保留中心化数据变化最大的方向。
摆放点,让低维距离尽量模仿原始距离表。
先用邻居图最短路估计流形距离,再做类似 MDS 的布局。
利用标签寻找投影方向,让类均值分开,同时让类内保持紧。
让每个类别保留自己的协方差,形成二次边界,而不是一个共享投影。
匹配高维与低维中的邻居概率。
用低维重尾相似度修补 SNE 的拥挤问题。
构造模糊邻居图,再优化具有相似成员强度的低维图。
feature-map会引出 PCA,因为二者都把输入改写成表示;PCA 从数据本身学到一个线性表示。mds与 PCA 形成对比,因为 MDS 从成对距离出发,而 PCA 从坐标方差出发。lda与 PCA 形成对比,因为 LDA 使用标签寻找分离方向,而 PCA 忽略标签。
预测问题
- 如果一个特征用米计量,另一个特征用毫米计量,在缩放前 PC1 可能发生什么?
- PCA 为什么要先减去均值再测量方差?
- 在上面的固定样例里,为什么保留 PC1 比只保留原始
height更好? - 为什么弯曲数据流形不适合普通 PCA?
图谱连接 : 主成分分析