计算 SVD 及伪逆

Computing SVD and pseudoinverse

简而言之, 考虑矩阵 A 的奇异分解:

则其 Moore-Penrose 伪逆由下式给出:

这篇文章将解释上面术语的含义, 以及如何在 Python 和 Mathematica 中计算它们。

奇异值分解(SVD)

矩阵的奇异值分解是坐标的一种变化,使得矩阵简单,对角化的推广。

矩阵对角化

如果方阵 A 可对角化,那么就有矩阵 P 使得

矩阵 D 为对角阵。你可以把 P 看成是坐标的变化,使得 A 尽可能简单。D 对角线上的元素是 A 的特征值,P 的列向量是对应的特征向量。

不幸的是, 并非所有的矩阵都可以对角化。而奇异值分解是一种对任何矩阵甚至是非方阵进行对角化的方法。

奇异值分解的推广

奇异值分解推广了对角化。SVD 中的矩阵 Σ 类似于对角化中的 D。 Σ 是对角阵,虽然可能不是方形。Σ 两边的矩阵类似于对角化中的 P 矩阵,虽然它们不一定是相互逆的。U 和 V 矩阵是方阵,但不一定具有相同维度。

Σ 对角线的元素不一定是特征值, 而是奇异值,一种广义的特征值。同样,U 和 V 的列向量也不一定是特征向量, 而分别是左奇异向量和右奇异向量。

星标上标表示共轭转置。如果矩阵元素都是实数,那么共轭转置就是转置。但是, 如果矩阵有复数项,则需要对每一项取共轭和转置。

U 和 V 是酉阵。矩阵 M 是酉阵,如果它的逆是它的共轭转置,即

伪逆与 SVD

矩阵的(Moore-Penrose)伪逆推广了逆的概念, 有点像 SVD 推广了对角化的概念。不是每个矩阵都有一个逆,但每个矩阵都有一个伪逆,甚至是非方阵。

从 SVD 计算伪逆很简单。

如果

其中 Σ+ 是由 Σ 通过对所有非零元素取倒数,留下所有的零元素,并使矩阵具有正确的形状:如果 Σ 是 矩阵, 那么 Σ+ 必须是 矩阵。

我们将用 Mathematica 和 Python 给出例子。

用 Mathematica 计算 SVD

让我们从矩阵 A 开始

我们可以用下面的 Mathematica 命令找到 A 的 SVD:

1
2
A = {{2, -1, 0}, {4, 3, -2}}
{U, S, V} = SingularValueDecomposition[A]

我们得到 A 的奇异值分解为:

注意,最后一个矩阵不是 V 而是 V 的转置。Mathematica 返回 V 自身。

如果我们将这些矩阵相乘,可以验证是否得回 A。

1
U . S. Transpose[V]

这将返回

1
{{2, -1, 0}, {4, 3, -2}}

用 Mathematica 计算伪逆

计算伪逆的 Mathematica 命令就是 PseudoInverse

1
PseudoInverse[A]

这将返回

1
{{19/60, 1/12}, {-(11/30), 1/6}, {1/12, -(1/12)}}

我们可以通过 SVD 确认计算的伪逆

1
2
Sp = {{1/Sqrt[30], 0}, {0, 1/2}, {0, 0}}
V . Sp . Transpose[U]

用 Python 计算 SVD

接下来, 我们用 Python(NumPy)计算奇异值分解。

1
2
>>> a = np.matrix([[2, -1, 0],[4,3,-2]])
>>> u, s, vt = np.linalg.svd(a, full_matrices=True)

需要注意的是,np.linalg.svd 返回的是 V 的转置。

此外, 对象 s 不是对角阵 Σ,而是只包含对角元素的向量, 即只是奇异值。NumPy 的方法 svd 有其他效率相关的选项,这里不再深入。

使用如下代码验证 SVD 是否正确:

1
2
>>> ss = np.matrix([[s[0], 0, 0], [0, s[1], 0]])
>>> u*ss*vt

返回的矩阵 A 在浮点精度内。这是由于 Python 做的是浮点计算,而不是像 Mathematica 那样的符号计算,A 中的零变成 -3.8e-16

用 Python 计算伪逆

伪逆可以在 NumPy 用 np.linalg.pinv 计算。

1
2
3
4
>>> np.linalg.pinv(a)
matrix([[ 0.31666667, 0.08333333],
[-0.36666667, 0.16666667],
[ 0.08333333, -0.08333333]])

与上面的 Mathematica 返回的结果相同,达到浮点精度。


原文链接:Computing SVD and pseudoinverse

GreatX wechat
关注我的公众号,推送优质文章。