奇异值分解SVD

参考资料

  1. Matlab说明文档

奇异值

矩形矩阵A的奇异值和对应的奇异向量分别为满足以下条件的标量\sigma以及一对向量uv
\begin{array}{l}{A v=\sigma u} \\ {A^{H} u=\sigma v}\end{array}

其中, A^HA的Hermitian转置,奇异向量uv通常缩放至范数为 1。此外,如果uv均为A的奇异向量,则-u-v也为 A 的奇异向量。

奇异值σ始终为非负实数,即使A为复数也是如此。对于对角矩阵Σ的对角线上的奇异值以及构成两个正交矩阵UV的列的对应奇异向量,方程为
\begin{array}{l}{A V=U \Sigma} \\ {A^{H} U=V \Sigma}\end{array}

对角矩阵(diagonal matrix)是一个主对角线之外的元素皆为0的矩阵,常写为diag(a1,a2,...,an) 。

由于UV均为单位矩阵,因此将第一个方程的右侧乘以V^H会生成奇异值分解方程
A=U \Sigma V^{H}

m×n 矩阵的完整奇异值分解涉及 m×mU、 m×nΣ以及 n×nV。换句话说,UV均为方阵,ΣA的大小相同。如果A的行数远多于列数 (m > n),则得到的 m×m 矩阵U为大型矩阵。但是,U中的大多数列与Σ中的零相乘。在这种情况下,精简分解可通过生成一个 m×nU、一个 n×nΣ以及相同的V来同时节省时间和存储空间:

与特征值分解的区别

特征值分解是分析矩阵(当矩形表示从向量空间到其自身的映射时)的合适工具,就像分析常微分方程一样。但是,奇异值分解是分析从一个向量空间到另一个向量空间(可能具有不同的维度)的映射的合适工具。大多数联立线性方程组都属于这第二类。

如果A是方形的对称正定矩阵,则其特征值分解和奇异值分解相同。但是,当A偏离对称性和正定性时,这两种分解之间的差异就会增加。特别是,实矩阵的奇异值分解始终为实数,但非对称实矩阵的特征值分解可能为复数。

精简分解

[U,S,V] = svd(A,'econ')

  • m > n - 只计算 U 的前 n 列,S 是一个 n×n 矩阵。
  • m = n - svd(A,'econ') 等效于 svd(A)。
  • m < n - 只计算 V 的前 m 列,S 是一个 m×m 矩阵。

[U,S,V] = svd(A,0)

  • m > n - svd(A,0) 等效于 svd(A,'econ')。
  • m <= n - svd(A,0) 等效于 svd(A)。

注意事项

如果矩阵A很大并且是稀疏矩阵,则使用 svd 来计算所有奇异值和向量在某些情况下可能会不太切合实际。例如,如果您只需了解几个最大的奇异值,则计算一个 5000×5000 稀疏矩阵的所有奇异值会带来大量额外工作。在只需要一部分奇异值和向量的情况下,svds 函数优先于svd

对于可作为满矩阵 full(A) 载入内存的较小矩阵,使用 svd(full(A)) 的速度可能仍旧快于使用 svds。但对于确实很大的稀疏矩阵,就有必要使用 svds。

待解决

  • Hermitian转置