奇异值分解〔SVD,Singular Value Decomposition〕在不少方面有应用,不过初看的话不太容易理解。本文整理了我对SVD的理解,难免存在不严谨的地方,不过希望可以帮助读者理解SVD。

了解一个方法的动机是很重要的。我觉得从优化问题入手,并且借助几何方法,比较容易理解SVD的动机。

餐前甜点:一个优化问题

现有m×nm\times n矩阵A\bold A,要找到一个mm维向量x\bold x,使二者乘积的模最小,也就是求以下优化问题的解:

min Axs.t.x=1 \begin{aligned} &\min \ ||\bold A \bold x|| \\ &\mathrm{s.t.} ||\bold x|| = 1 \end{aligned}

如果用线性变换的方式表述问题,线性变换AL(V,W)A \in \mathcal{L}(V,W)xVx \in V,求xx使Ax||Ax||最小。

问题的转化

可以注意到,最小化Ax||\bold A \bold x||其实就是最小化Ax2||\bold A \bold x||^2,稍一改写,其实就是

Ax2=(Ax)T(Ax)=xT(ATA)x ||\bold A \bold x||^2 = ||(\bold A\bold x)^T(\bold A \bold x)|| = ||\bold x^T (\bold A^T \bold A) \bold x||

可以注意到ATA\bold A^T \bold A是个对称方阵(如果看作是算子,那么是个「自伴算子」),因为它的转置和自身相等。于是接下来重点放在ATA\bold A^T\bold A这个「性质良好」的矩阵上,将其记为M\bold M

(ATA)T=AT(AT)T=ATA (\bold A^T \bold A)^T = \bold A^T (\bold A^T)^T = \bold A^T \bold A

任何对称方阵都对应一个二次型,而这里,我们最小化问题的目标函数正是M\bold M对应的二次型。

具体实例的可视化

在开始介绍SVD之前,可以先来观察几个实例。

比如说我们假定:

M=(2001) \bold M = \begin{pmatrix} 2 & 0 \\ 0 & 1\end{pmatrix}

在二维平面可视化这个矩阵对应的线性变换是很容易的,yy方向上不动,xx方向上拉伸到原先的两倍。我们限定了x=1||\bold x|| =1,其实就是限定了在单位圆上找点。因此我们关心单位圆被这个线性变换映射成了什么图形。

答案是椭圆。如图,单位圆上的点被映射到椭圆上,如果说x\bold x的图像是单位圆,那么Mx\bold M \bold x的图像就是图中的椭圆,很显然,从图中可以看出,x=(0,±1)T\bold x = (0, \pm 1)^T的时候,映射后的向量模最小。

第一个例子

本例比较简单,如果一定要计算才放心的话,高中数学的方法尚可解决。

上面那个实例中M\bold M是对角阵。如果M\bold M不是对角阵是什么情况?下面来看第二个实例。

假设有

M=(2111) \bold M = \begin{pmatrix} 2 & 1 \\ 1 & 1 \end{pmatrix}

Mx\bold M\bold x的图像依旧是椭圆,下图中u\bold u被映射到v\bold v,方向发生了改变。经过M\bold M的映射,只有特征向量的方向不会发生改变,因为如果v\bold v是特征向量,则有Mv=λv\bold M\bold v = \lambda \bold v。而恰恰就是特征向量的方向缩小或扩张得最厉害,可以对着下图验证一下。。

第二个例子

为什么还是椭圆?

这涉及到一个关键的事实:如果我们重新找一对标准正交基,那么M\bold M在新的基下可以写成一个对角矩阵,那么在新的基下(或者说,新的座标系下),Mx\bold M\bold x的方程可以写成标准椭圆方程。

为什么可以换座标系这样求解?可以注意到,旧的基显然是标准正交基,如果新的基也是标准正交基,那么在这两个基之间进行变换,其实相当于只是做了一下旋转+轴对称,没有改变向量的模长,因此在新的基下求解是可行的。想象一下,把上图的蓝色椭圆“摆正”之后再进行求解。

那么为什么可以找到让M\bold M对角化的标准正交基呢?因为M\bold M的几个特征向量恰恰是相互正交的!读者可以就本例的M\bold M验证一下。这涉及到谱定理,稍后将证明。

读者不妨考虑一下如果对称矩阵M\bold M不满秩的情况(或者说线性变换把高维空间压缩到低维空间是怎样的情况),映射的结果其实是一个退化的椭圆。

到这里,我们大致有解决问题的思路了:找到映射后的椭圆,然后把它摆正,然后容易知道横向和纵向总是“拉伸”或者“压缩”最显著的方向,据此可以求解。这种思想可以推广到高维。

谱定理

上面的注解提到了谱定理。谱定理保证了M\bold M在某个标准正交基下是对角矩阵,也就是可以正交对角化

因此作为SVD的准备,需要先证明谱定理〔the spectral theorem〕。

我们可以从两个不同的角度表述谱定理。

本文中谱定理特指「谱定理」,简单说就是针对实数构成的矩阵/实向量空间。

表述

可以这样表述谱定理。

n×nn \times n的矩阵AA

  1. AAnn个实特征值(算上重数)
  2. AA的特征向量正交
  3. AA可以被正交对角化

也可以这样表述谱定理:

TL(V)T \in \mathcal L(V),那么以下条件等价:

  1. TT是自伴的

  2. VV有一个由TT的本征向量组成的规范正交基

  3. TT有关于VV的某个规范正交基有对角矩阵

概念准备

定理的表述出现了一些国内教学中不常出现的概念,需要先对这些概念及其性质作出解释。

算子TL(V,V)T \in \mathcal L(V, V),也就是从VV映射到VV的线性变换,则TT称为VV上的算子,记为TL(V)T \in \mathcal L(V)

伴随〔adjoint〕:给定TL(V,W)T \in \mathcal L(V, W)(也就是从向量空间VV到向量空间WW的线性映射),如果有T(W,V)T^*\in (W, V),取vVv \in VwWw \in W,使

Tv,w=v,Tw \langle Tv, w \rangle = \langle v, T^*w\rangle

那么TT^*称为TT的伴随。

可以证明一定存在这样的伴随,具体参考LADR。这里只举LADR中的一个例子,通过这个例子可以感受一下为什么伴随一定存在。

T(x1,x2,x3)=(x2+x3,2x1)T(x_1, x_2, x_3) = (x_2 + x_3, 2x_1)

(x1,x2,x3),T(y1,y2)=T(x1,x2,x3),>(y1,y2)=(x2+3x3,2x1,(y1,y2)=x2y1+3x3y1+2x1y2=(x1,x2,x3),(2y2,y1,3y1) \begin{aligned} \langle (x_1, x_2, x_3), T^* (y_1, y_2) \rangle = & \langle T(x_1, x_2, x_3), > (y_1, y_2) \rangle \\ = & \langle (x_2 + 3x_3, 2x_1, (y_1, y_2) \rangle \\ = & x_2y_1 + 3x_3y_1 + 2x_1y_2 \\ = & \langle (x_1, x_2, x_3), (2y_2, y_1, 3y_1) \rangle \end{aligned}

所以T(y1,y2)=(2y2,y1,3y1)T^*(y_1, y_2) = (2y_2, y_1, 3y_1)

伴随相当于矩阵转置。对于实线性变换,其伴随对应的矩阵,就是它本身的矩阵的转置。在此不证明。另外,容易证明算子和其伴随有相同的本征向量。

自伴〔self-adjoint〕:和自己的伴随相等,称为自伴。自伴相当于矩阵对称

谱定理的简单证明

这部分证明可能不严谨,和LADR书上的不同。

如果实线性变换T(V)T\in \mathcal(V)dimV\mathrm{dim} V个线性无关的本征值,那么谱定理的证明很容易。

在这个条件下,我们来证明自伴算子对于某个标准正交基有对角矩阵。

TT的特征向量为基,那么在这个基下,TT对应的矩阵是个对角矩阵。如果我们对这个基做一下格拉姆-施密特正交化〔Gram-Schmidt Method〕,得到基的就是正交的,而且TT对应新的基的矩阵就是个上三角矩阵。

如果对此不理解,随便找个基,亲手算算,自然就懂了。比如说有一组基v1,v2,,vnv_1, v_2, \dots , v_nn=dimVn = \mathrm{dim}VTT关于这组基有的矩阵是对角矩阵,就是说Tvk=λkvkTv_k = \lambda_k v_k。正交化之后得到u1,u2,,unu_1, u_2, \dots, u_n

u1=v1u2=v2(v2u1)u1u3=v3(v3u2)u2(v3u1)u1 \begin{aligned} u_1 &= v_1 \\ u_2 &= v_2 - (v_2\cdot u_1)u_1 \\ u_3 &= v_3 - (v_3\cdot u_2)u_2 - (v_3\cdot u_1)u_1 \\ & \cdots \end{aligned}

因此TT对应u1,u2,,unu_1, u_2, \dots, u_n这组基的矩阵

(λ1v2u1v3u10λ2v3u200λ3) \begin{pmatrix} \lambda_1 & -v_2\cdot u_1 & -v_3\cdot u_1 & \cdots\\ 0 & \lambda_2 & -v_3\cdot u_2 & \cdots\\ 0 & 0 & \lambda_3 & \cdots \\ \vdots \end{pmatrix}

是个上三角矩阵。

而对于自伴算子,这个上三角矩阵就是对角矩阵。

考虑算子TT,其对应的矩阵为M\bold M,那么TT^*对应的矩阵是MT\bold M^T(算子伴随相当于矩阵转置)。根据上面的结果,如果取基适当,可以把M\bold M化为上三角矩阵,对应地,MT\bold M^T就是下三角矩阵。

如果TT自伴,那么T=TT = T^*,那么有M=MT\bold M = \bold M^T。上三角矩阵和下三角矩阵相等,当且仅当对角线以外的部分全部为0。因此M\bold M是对角矩阵。

也就是说,我们找到了一组基,使得TT对应的矩阵是对角矩阵。对这组基做一下标准化,就得到一组标准正交基,归一化不改变向量的方向,TT关于这组标准正交基的矩阵依然是对角矩阵。即任取一个wk=ukukw_k = \frac{u_k}{||u_k||},有Twk=μwkTw_k = \mu w_k

根据本征向量的定义,这组标准正交基中的每个向量都是TT的本征向量。

最后一步很容易证明:如果一个线性变换关于某个标准正交基有对角矩阵,则它是自伴矩阵。

至此,我们证明了添加额外条件后的谱定理。

实谱定理的完整证明

要证明完整的实谱定理,关键在于去掉TTnn个本征向量这一假设。但我觉得没有必要把完整的实谱定理的证明放上来,毕竟我们的目标是SVD。对证明感兴趣,可以参阅LADR。

如果要沿着上面的证明证下去,首先得证明TT作为自伴算子,一定有本征值。接下来,得证明TT即使没有dimV\mathrm{dim}V个本征向量,也能够找到一个标准正交基。基本思想就是将TT限制到更低维的空间UU,使他在里面满足上面“青春版”的谱定理,然后不断补充和这些UU的基正交的向量。

主菜:奇异值分解

有了谱定理,接下来的证明会轻松很多。我们可以先把椭圆“摆正”,然后再进行求解。

等距同构和正交矩阵

算子SL(V)S\in \mathcal L (V)是等距同构,当且仅当它保范数,即Sv=v||Sv|| = ||v||

其实就是说,算子对应的矩阵是正交矩阵。这点容易证明。

Sv2=SvSv=vTSTSv=v2=vv=vTv \begin{aligned} ||Sv||^2 &= ||Sv\cdot Sv|| \\ &= ||v^TS^TSv|| \\ &= ||v||^2 = ||v\cdot v|| = ||v^Tv|| \end{aligned}

所以STS=IS^TS = I,即SS是正交矩阵。

正算子和半正定矩阵

正算子:TL(V)T\in \mathcal L(V),且TT自伴,对任意vVv\in VTv,v0\langle Tv, v\rangle \ge 0,那么是TT是正算子。

半正定矩阵:对任意二次型x\bold xxTAx0\bold x^T \bold A \bold x \ge 0,那么A\bold A是半正定矩阵。

正算子的矩阵就是半正定矩阵。

定义正算子TT平方根R,为满足R2=TR^2 = T的算子。

可以证明,TTRR的所有本征值非负,前者的本征值是后者对应本征值的平方。据此可以继续证明,正算子的平方根是唯一的,而且是自伴的。

之后把RR记为T\sqrt{T}

极分解

TL(V)T\in \mathcal L (V)。那么TTT^*T是正算子。换一种说法,就是说任取矩阵A\bold AAA\bold A^\bold A是半正定的对称矩阵。证明不难,我们已经证明了TTT^*T是自伴的,接下来只要证明它满足正算子的定义。

TT,v=Tv,Tv=Tv20 \langle T^*T, v \rangle = \langle Tv, Tv \rangle = ||Tv||^2 \ge 0

然后终于可以引入极分解了!

TL(V)T \in \mathcal L(V),那么存在SL(V)S \in \mathcal L(V),使T=STTT = S\sqrt{T^*T}

为什么可以这样分解?推导如下:

Tv2=Tv,Tv=TTv,v=TTTTv,v=TTv,TTv=TTv2 \begin{aligned} ||Tv||^2 &= \langle Tv, Tv \rangle \\ &= \langle T^*Tv, v \rangle \\ & = \langle \sqrt{T^*T}\sqrt{T^*T}v, v \rangle \\ &= \langle \sqrt{T^*T}v, \sqrt{T^*T}v \rangle = ||\sqrt{T^*T}v||^2 \end{aligned}

所以有Tv=TTv||Tv|| = ||\sqrt{T^*T}v||。定义S1S_1为满足以下条件的算子

S1Tv=TTv S_1Tv = \sqrt{T^*T}v

可以证明S1S_1可以扩张为一个等距同构,在此不表,细节参阅LADR。

极分解告诉我们,如果一个矩阵没法对角化,没关系,我们把它“旋转”一下可以变成一个对称矩阵,就肯定可以对角化了。旋转不影响范数,也就是保持向量长度不改变,刚好符合我们的要求。

奇异值分解

奇异值:TT\sqrt{T^*T}的本征值

终于可以引入奇异值分解了。注意到,根据谱定理,TT\sqrt{T^*T}是可以正交对角化的,求它的本征值即可。也就是说,有正交矩阵VV

TT=VΣVT \sqrt{T^*T} = V\Sigma V^T

再使用极分解,就得到了方阵的奇异值分解。下面SSVVUU都是正交矩阵。

T=STT=SVΣVT=UΣVT T = S \sqrt{T^*T} = SV \Sigma V^T = U\Sigma V^T

可以把这个结论推广到方阵以外的矩阵,在需要的地方补0即可。

求奇异值不一定要对算子开平方,因为T\sqrt TTT本身有相同的特征向量,前者对应的特征值是后者特征值开平方。

UU的列向量称为左奇异向量,VV的列向量称为右奇异向量。

餐后消食片:回到优化问题

谱定理告诉我们,映射之后是椭圆、可以把椭圆摆正求解。

而摆正之后,横向和纵向就是拉伸、压缩最显著的地方,拉伸和压缩的倍数就是特征值。奇异值的意义,就是这些倍数。

奇异值分解把这一切串了起来。

现在还差一步没有证明,为什么“横向和纵向就是拉伸、压缩最显著的地方”,在前面我们是通过几何直觉判断出来的,这不利于推广到高维。现在来证明。

所谓横向和纵向,其实就是基的方向。A\bold A如果有本征值,记最大的为MM,最小的为mm

那么Ax=1nλkxim1nxi||\bold A\bold x|| = \sum_1^n \lambda_k x_i \ge m\sum_1^n x_i。并且这个最小值是可以取到的,当x=(x1,x2,,xn)Tx=(x_1, x_2, \cdots, x_n)^Tmm对应的特征向量的时候,取得这个最小值。最大值同理可得。


至此我们已经知道如何求解优化问题,找到x\bold x,使

min Axs.t.x=1 \begin{aligned} &\min \ ||\bold A \bold x|| \\ &\mathrm{s.t.} ||\bold x|| = 1 \end{aligned}

方法就是,对A\bold A做奇异值分解得到A=UΣVA = U\Sigma V(即求出ATA\bold A^T\bold A的特征值,然后逐一开平方),取出最小的特征值,找到它在UU中对应的奇异向量即为我们想求的。


最后再提供一个具体例子。设上面优化问题的$ A$是

A=(1101) A = \begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix}

AA是不能对角化的,但是ATAA^TA可以。

Lambda, P = np.linalg.eig(np.array([[1, 1], [1, 2]]))

得到

P = array([[-0.85065081, -0.52573111],
       [ 0.52573111, -0.85065081]])
Lambda = array([0.38196601, 2.61803399])

所以ATA=PΛPT\sqrt{A^TA} = P\sqrt{\Lambda} P^T,就是

np.matmul(P, np.matmul(np.diag(np.sqrt(Lambda)), P.T))

得到

array([[0.89442719, 0.4472136 ],
       [0.4472136 , 1.34164079]])

可以把它的图像画出来,如下图,访问这里可以进行交互。可以看到只是做了个旋转罢了,这就是极分解做的事情。

最后一个例子

顺便可以通过可交互的图验证一下SVD的结果和画出来的图是否相合。

U, Sigma, VT = np.linalg.svd(np.array([[1, 1], [0,1]]))
U = array([[ 0.85065081, -0.52573111],
       [ 0.52573111,  0.85065081]])
Sigma = array([1.61803399, 0.61803399])
VT = array([[ 0.52573111,  0.85065081],
       [-0.85065081,  0.52573111]])