奇异值分解提供了一种将任意矩阵 A 分解为乘积 A=UΣVT 的方法。这种分解不仅仅在数学上很精巧。它在简化数据方面,特别是对于降维,被证明非常有用。
其核心思想依赖于对角矩阵 Σ。Σ 的对角线元素,记作 σ1,σ2,…,σr(其中 r 是 A 的秩),是 A 的奇异值。按照惯例,这些奇异值按降序排列:σ1≥σ2≥⋯≥σr>0。这些奇异值衡量了沿 U 对应列(左奇异向量 (vector))和 V 对应列(右奇异向量)所定义方向上所捕获的重要程度或“能量”。
使用SVD进行降维的原理是只保留该分解中最重要的部分。具体来说,我们选择前 k 个奇异值(其中 k<r)及其相关的奇异向量。我们丢弃剩余的 r−k 个奇异值和向量,它们对应于数据变化最小的方向。
在数学上,我们通过截断矩阵 U、Σ 和 V 来形成 A 的一个近似:
- 保留 U 的前 k 列,形成 Uk(一个 m×k 矩阵)。
- 保留 Σ 的左上角 k×k 块,形成 Σk(一个对角线元素为 σ1,…,σk 的对角矩阵)。
- 保留 V 的前 k 列(对应于 VT 的前 k 行),形成 Vk。然后取其转置 VkT(一个 k×n 矩阵)。
这样, A 的低秩近似由下式给出:
Ak=UkΣkVkT
这个矩阵 Ak 的秩为 k,并且是原始矩阵 A 的最佳秩-k 近似,因为它使差值 ∥A−Ak∥F 的Frobenius范数最小化。这是一个基本性质,通常被称为Eckart-Young定理,尽管了解其结果比记住名称更重要:SVD为您提供了将矩阵 A 压缩为秩-k 表示的最佳方式。
SVD如何进行降维
可以将原始的 m×n 矩阵 A 看作表示 m 个数据点,每个点具有 n 个特征(反之亦然)。SVD为 A 的行空间(通过 V)和列空间(通过 U)找到了新的正交基。转换 A 实质上是将行空间基中的向量 (vector)映射到列空间基中,并按奇异值进行缩放。
- 大奇异值 (σi): 表示数据展现出显著变异的维度(主要方向)。这些方向捕获了数据的主要结构。
- 小奇异值 (σi): 表示数据变异很小的维度。这些方向可能代表噪声或不太重要的细节。
通过将较小的奇异值设为零(这实际上就是截断为 Ak 所做的事情),我们将原始数据投影到由与最大奇异值相关联的主要方向所张成的低维子空间上。我们保留了最重要的变异,同时丢弃了信息较少的部分。
选择维度数量 k
保留的维度数量 k 的选择取决于具体的应用。常见的方法包括:
- 固定数量: 选择预定的维度数量(例如,为了可视化目的降至 k=2 或 k=3)。
- 解释方差: 计算由前 k 个奇异值捕获的方差比例。总方差(平方和)与所有奇异值的平方和 ∑i=1rσi2 成比例。我们选择 k 以使保留的方差达到期望的阈值(例如,90%、95%、99%):
∑i=1rσi2∑i=1kσi2≥阈值
绘制奇异值(或其平方的累积和)有助于直观地看到“拐点”出现的位置,这表示增加更多维度时回报递减。
一张典型的图表,显示排序后的奇异值迅速下降,同时累积解释方差快速接近100%。这有助于选择一个合适的 k 值。
与主成分分析 (PCA) 的联系
使用SVD进行降维与主成分分析 (PCA) 紧密关联。实际上,SVD提供了一种数值稳定计算数据集主成分的方法。如果数据矩阵 A 的列是中心化的(减去均值),那么右奇异向量 (vector)(V 的列)对应于主方向,并且奇异值的平方 (σi2) 与每个主成分捕获的方差成比例。应用截断SVD Ak=UkΣkVkT 实际上是将数据投影到前 k 个主成分上。
优点与不足
使用SVD进行降维提供了一些优点:
- 数据压缩: 减少数据矩阵的存储需求。
- 降噪: 较小的奇异值通常对应于噪声,这些噪声会被滤除。
- 计算加速: 后续算法在降维数据上运行更快。
- 可视化: 允许将高维数据投影到2或3个维度上。
然而,也存在一些需要考虑的方面:
- 信息丢失: 降维本质上是会造成信息损失的。如果 k 选择得太小,重要信息可能会被丢弃。
- 可解释性: 新的维度(原始特征的组合)可能更难直接解释。
- 计算开销: SVD本身的计算对于非常大的矩阵而言可能计算密集,尽管在NumPy (
numpy.linalg.svd) 和 SciPy (scipy.linalg.svd) 等库中存在高效算法。
尽管分解本身的计算开销较大,SVD仍然是许多机器学习 (machine learning)流程中降低数据集复杂度的基本方法,它使得处理更高效,并且有时通过滤除噪声来提高模型的泛化能力。