为什么奇异值分解可以实现数据降维
结论
奇异值分解(Singular Value Decomposition,SVD)可以把一个矩阵分解成三个矩阵:
其中:
- :原始数据矩阵。
- :左奇异向量矩阵。
- :奇异值矩阵,主对角线上是奇异值。
- :右奇异向量矩阵的转置。
SVD 能降维的关键在于:奇异值按重要性从大到小排列,较大的奇异值保留了数据中的主要结构,较小的奇异值通常对应细节、噪声或次要变化。
核心思想
SVD 把数据拆成一组按重要性排序的方向。只保留最重要的前 个方向,就能用更低维度近似表示原始数据。
(附件 svd-low-rank.svg 未随站点发布)
上图中的 、、 表示只保留前 个主要方向,用低秩矩阵 近似原始矩阵 。
数据矩阵怎么理解
假设有一个数据矩阵:
可以把它理解为:
- 行:样本数量。
- 列:特征数量。
例如:
- 每一行是一篇文章。
- 每一列是一个词。
- 矩阵中的数值表示某个词在文章中的权重。
或者:
- 每一行是一张图片。
- 每一列是一个像素。
- 矩阵中的数值表示像素灰度。
如果 很大,数据维度就很高。高维数据通常会带来存储、计算、可视化和建模上的困难。
SVD 的分解含义
SVD 分解为:
可以直观理解为:
其中最关键的是 。
的主对角线元素是奇异值:
奇异值越大,说明对应方向对原始矩阵的贡献越大。
为什么可以只保留前 k 个奇异值
完整 SVD 可以写成多个秩一矩阵的和:
其中:
- 是矩阵的秩。
- 是第 个左奇异向量。
- 是第 个右奇异向量。
- 是第 个奇异值。
因为奇异值已经从大到小排序,所以前几项通常贡献最大。
如果只保留前 项:
就得到原矩阵的低秩近似:
这就是 SVD 降维的数学基础。
低秩近似是什么意思
矩阵的秩可以理解为数据中真正独立的信息方向数量。
如果一个矩阵看起来有很多列,但这些列之间高度相关,那么它的有效信息维度可能远小于列数。
例如:
- 一张图片有很多像素,但大块区域颜色相近。
- 用户评分矩阵有很多商品,但用户偏好可能由少数兴趣因素决定。
- 文档词频矩阵有很多词,但文章主题可能只有少数几个。
SVD 可以找出这些主要方向,然后丢掉次要方向。
SVD 降维的几何理解
矩阵可以看成一种线性变换。
SVD 把这个变换拆成三步:
- :先旋转或重新选择坐标方向。
- :沿不同方向缩放。
- :再旋转到输出空间。
其中 的奇异值决定每个方向被拉伸多少。
如果某个方向的奇异值很小,说明数据在这个方向上的变化很弱。去掉这个方向,对整体形状影响不大。
Note
降维不是随便删列,而是换到一组更能表示数据结构的新坐标系,然后保留最重要的坐标方向。
为什么这能压缩数据
原始矩阵 有 个数。
如果用前 个奇异值近似,则只需要保存:
- :
- :
- :
总参数量大约是:
也就是:
当 远小于 和 时,存储量会明显下降。
和 PCA 的关系
PCA(主成分分析)也可以用 SVD 实现。
如果对数据矩阵做中心化,然后对中心化后的矩阵做 SVD,那么右奇异向量对应 PCA 的主成分方向,奇异值反映每个主成分解释的方差大小。
所以 SVD 降维和 PCA 降维有很深的关系:
- SVD 是矩阵分解方法。
- PCA 是统计降维方法。
- 中心化数据上的 SVD 可以用于计算 PCA。
一个简单例子
假设一个矩阵的奇异值是:
前两个奇异值已经远大于后面三个。
这说明数据的主要结构大多集中在前两个方向上。保留前两个方向,舍弃后三个方向,就能在损失较小的情况下把数据从 5 个方向压缩到 2 个方向。
为什么小奇异值常常可以丢掉
小奇异值对应的方向贡献较小,可能来自:
- 测量噪声。
- 偶然波动。
- 非主要模式。
- 对整体结构影响很小的细节。
丢掉这些方向后,数据反而可能更清晰,因为噪声被过滤了。
但这不是绝对的。如果小奇异值对应的是业务上重要的稀有信号,直接丢掉可能会损失关键信息。
Warning
SVD 降维保留的是数学意义上的主要能量,不一定等于业务意义上的重要信息。异常检测、欺诈检测、故障预警等场景中,小模式也可能很重要。
如何选择 k
常见方法是看累计能量占比:
如果前 个奇异值的平方和占总平方和的 90% 或 95%,就可以认为它们保留了大部分信息。
也可以画奇异值曲线,寻找明显拐点:
- 拐点之前:主要结构。
- 拐点之后:细节或噪声。
应用场景
SVD 降维常用于:
- 图像压缩。
- 文本主题分析。
- 推荐系统。
- 噪声过滤。
- 特征压缩。
- 可视化前的降维。
- 矩阵补全。
小结
SVD 能实现数据降维,是因为它把原始矩阵拆成一组按重要性排序的方向。奇异值越大,对数据结构贡献越大。只保留前 个最大奇异值及其对应方向,就能得到低维近似。
记忆方式
SVD 降维就是:找到数据最重要的几个方向,保留它们,丢掉贡献小的方向,用更少的信息近似表示原始数据。