首页 / 无监督学习 / 降维技术

降维:把四个特征压成两个,凭什么不心疼

PCA 做的事情只有一句:找一根轴,让数据在它上面的投影尽量散开。 找到第一根,再找跟它垂直的第二根里最散的,依此类推。 它之所以敢丢维度,是因为数据常常本来就没占满整个空间—— 四个特征都在描述「花有多大」,那就没必要留四份。 这一页可以亲手转轴:看在哪一个角度,投影的方差到了最大。

原始空间:主成分方向与投影
方差谱:每一根主成分吃掉了多少信息
降到 k 维之后

                
              
这一页的 PCA 是自己实现的——中心化、对称矩阵的 Jacobi 特征分解、 SVD、投影、逆变换全是手写,没有用任何线性代数库。 主成分方向 / 解释方差比 / 投影坐标 / 重构误差都与 sklearn 的 逐项对拍过。

① 它在找什么:一根"最散"的轴

把数据投影到某个单位方向 上, 投影后的一维数据有多散,用方差衡量。PCA 要的就是让这个方差最大的 :

这个最大化问题有闭式解:把数据写成矩阵并做中心化 ,最优方向就是 的最大特征值对应的特征向量。第二根轴则在"与第一根垂直"的 约束下重复同一件事——所以主成分天然两两正交。

② 为什么用 SVD 而不是协方差矩阵

数学上两者等价: 时, 的特征值正是 , 特征向量正是 的列。但数值上不等价:

先组协方差矩阵,等于把奇异值平方了一遍 (), 条件数从 变成 。 当矩阵本身接近奇异时,最小的那几根轴会丢精度甚至变成负数。 所以 sklearn 默认走 SVD——这一页也走 SVD, 只在求 的那一步用到了 对称矩阵的特征分解。

③ 中心化,但不要随便标准化

sklearn 的 PCA 只做中心化(减均值),不做标准化。 这不是疏忽,是刻意的:标准化与否给出的是两个不同的问题。

把页面的数据集切到「鸢尾花(标准化后)」对比一下, 第 1 主成分从 92.5% 掉到 73.0%。更狠的是那个诊断实验: 只把「萼片长」的单位从厘米换成 0.1 毫米(数字乘 100, 物理含义完全没变),第 1 主成分占比立刻从 92.5% 飙到 99.98%,方向也变成几乎只指着萼片长。

所以:量纲不统一时必须标准化(比如"收入(元)"和"年龄(岁)"); 量纲本来就统一时不要标准化(比如四个都是厘米), 否则会把"哪个特征更重要"这个信息也一起抹掉。

④ 丢掉的那部分去哪了

保留前 k 个主成分,等价于把数据正交投影到一个 k 维子空间上, 被丢掉的部分正是垂直于该子空间的分量。丢掉的方差等于 , 所以"累计解释方差比"就是"信息保住了多少"。

但要注意:保住方差 ≠ 保住结构。 右侧「近邻保持」那一项才是更贴近实际用途的指标—— 降维后原本挨得近的点,有多少还挨着。

1. 主成分的方向为什么可以整体取反?这算不算"两个答案"?
不算。特征向量 与 是同一条直线的两个方向, 投影到它上面得到的方差完全一样——轴上没有"正反"这回事。 所以对拍时不能直接比数值,得先对齐符号(本页对拍脚本就是这么做的)。 真正唯一的是**子空间**(那根轴),不是轴上的朝向。
2. 页面上把 k 从 4 调到 1,方差只丢了 7.5%,是不是说我随便丢三个特征也行?
不行,这是两件不同的事。
丢掉整个特征:比如"花瓣宽"整个不用了, 那么这一列里的所有信息(包括它和其他特征不共享的那部分)全没了。
丢主成分:丢掉的是"所有特征共同构成的某个方向", 剩下的主成分里,每个原始特征都还留着一部分。
鸢尾花的例子最能说明问题:第 4 个主成分只占 0.52% 的方差, 但它几乎只由「花瓣宽」的独特成分构成 (方向是 )。 丢它损失的确很小——但那 0.52% 是别处拿不回来的。
3. 「不相关二维数据」那组,两个主成分占比 58.9% : 41.1%,这说明什么?
说明这组数据没有可压缩的空间。 两块都是圆的、方差差不多,"降成一维"无论怎么选轴都要丢掉四成信息。 PCA 的能力上限是数据本身给的:只有当特征之间有冗余(相关性强)时, 降维才几乎不心疼。翻回「相关二维数据」那组看看—— 98.3% : 1.7%,降到一维只丢 1.7%。这两组并排放着, 就是"降维凭什么有效"最直白的答案。
4. 既然保留 100% 方差就是原数据,那 PCA 和"什么都不做"有什么区别?
区别在于:即使保留全部维度,PCA 也**换了一套坐标**。 新坐标系里轴的顺序是"按信息量排的",而且新轴之间两两不相关 (协方差矩阵是对角阵)。
这两条本身就有用:① 想知道"哪几根轴重要",看方差谱就行; ② 有些算法(比如需要求逆的线性模型)很怕特征相关, 换成主成分坐标系会稳得多。所以 PCA 的价值不止"变少",还有"变正交"。
5. PCA 是有监督还是无监督?它会看标签吗?
无监督——整个推导里没有出现过标签, 它只在意"数据散得开不开"。这是它的局限所在: 如果某个方向方差很小但恰好是区分类别的关键, PCA 会毫不犹豫地把它丢掉。
这一页的鸢尾花是个幸运的例子:setosa 那一簇在前两个主成分上分得很开, 所以降维之后分类依然容易。真想"沿着对分类有用的方向"降维, 得换 LDA(线性判别分析)——它用了标签, 目标是"类间散度大、类内散度小"。