Preface 前言

SVD (Singular Value Decomposition) 在机器学习等其他领域有着非常广泛的应用,本文主要是受到计算机图像学课和以前看到的材料的启发,希望对SVD有更深入的了解。

相关的pdf资料可以参见github上的记录。本文行文基本上是对它的翻译和理解。

Preparation

我们先叙述一些名词和涉及到的线性代数中的一些看法。

非齐次线性方程组Ax=b{Ax=b}的计算可以有两种形式,这取决于我们对矩阵具体含义的看法。

如计算:

[1332]×[31]{ \left[ \begin{matrix} 1 & 3 \\ -3 & 2 \\ \end{matrix} \right] \times \left[ \begin{matrix} 3 \\ 1 \end{matrix} \right] }

我们一般习惯的计算方式是row-wayai,j{a_{i,j}}是左矩阵的i{i}行和右矩阵的j{j}列对应相乘求和,即:

[1332]×[31]=[[13]×[31][32]×[31]]=[67]{ \left[ \begin{matrix} 1 & 3 \\ -3 & 2 \\ \end{matrix} \right] \times \left[ \begin{matrix} 3 \\ 1 \end{matrix} \right] = \left[ \begin{matrix} \left[ \begin{matrix} 1 & 3 \end{matrix} \right] \times \left[ \begin{matrix} 3 \\ 1 \end{matrix} \right] \\ \left[ \begin{matrix} -3 & 2 \end{matrix} \right] \times \left[ \begin{matrix} 3 \\ 1 \end{matrix} \right] \end{matrix} \right] = \left[ \begin{matrix} 6 \\ 7 \end{matrix} \right] }

column-way将矩阵看成列向量组,我们得到的结果b{b}就是列向量组的线性组合,系数为x{x}

[1332]×[31]=3×[13]+1×[31]=[67]{ \left[ \begin{matrix} 1 & 3 \\ -3 & 2 \\ \end{matrix} \right] \times \left[ \begin{matrix} 3 \\ 1 \end{matrix} \right] = 3 \times \left[ \begin{matrix} 1 \\ -3 \end{matrix} \right] + 1 \times \left[ \begin{matrix} 3 \\ 1 \end{matrix} \right] = \left[ \begin{matrix} 6 \\ 7 \end{matrix} \right] }

Column-Way使得我们将求解非齐次线性方程组Ax=b{Ax=b}看成用列向量组A{A}表出b{b},如果:

  • b{b}在列向量组张成的空间中,则我们一定可以求得x{x},它是表出的系数。
  • b{b}不在列向量组张成的空间中,我们希望求得它的最小二乘解。

Anotations

我们给出四个特殊的名词。

Perpframes(正交标架)


Perpframe一词源于Perpendicular(垂直)和frame(框架)。更好的理解的说法是orthonormal basis(单位正交基)。我们给定一组单位正交基[v0,v1,,vn]{\left[v_{0},v_{1}, \cdots, v_{n}\right]},它满足:

{viTvj=0ijviTvj=1i=j{ \left\{ \begin{array}{lc} v_{i}^{T}v_{j} = 0 & i \neq j \\ v_{i}^{T}v_{j} = 1 & i = j \end{array} \right. }

以下我们使用一组二维平面的单位正交基[v1,v2]{[v_{1},v_{2}]}来叙述。

Aligners


上述的单位正交基对应的Aligners 定义为:

[v1Tv2T]{\left[ \begin{matrix} v_{1}^{T} \\ v_{2}^{T} \end{matrix} \right]}

它具有如下的性质:

[v1Tv2T]v1=[v1Tv1v2Tv1]=[10][v1Tv2T]v2=[v1Tv2v2Tv2]=[01]{ \left[ \begin{matrix} v_{1}^{T} \\ v_{2}^{T} \end{matrix} \right] \cdot v_{1} = \left[ \begin{matrix} v_{1}^{T} \cdot v_{1} \\ v_{2}^{T} \cdot v_{1} \end{matrix} \right] = \left[ \begin{matrix} 1 \\ 0 \end{matrix} \right] \quad \left[ \begin{matrix} v_{1}^{T} \\ v_{2}^{T} \end{matrix} \right] \cdot v_{2} = \left[ \begin{matrix} v_{1}^{T} \cdot v_{2} \\ v_{2}^{T} \cdot v_{2} \end{matrix} \right] = \left[ \begin{matrix} 0 \\ 1 \end{matrix} \right] }

也就是说,Aligners将单位正交基投影到x-y坐标轴(即二维平面的标准正交基[e1,e2]{\left[e_{1},e_{2} \right]})。

Hangers


上述的单位正交基对应的Hangers定义为:

[v1,v2]{\left[ v_{1}, v_{2} \right]}

它具有的性质是:

[v1,v2][01]=v2[v1,v2][10]=v1{ \left[ v_{1}, v_{2} \right] \cdot \left[ \begin{matrix} 0 \\ 1 \end{matrix} \right] = v_{2} \quad \left[ v_{1}, v_{2} \right] \cdot \left[ \begin{matrix} 1 \\ 0 \end{matrix} \right] = v_{1} \quad }

也就是说,Hangers的作用正好和Aligners相反,它把标准正交基投影到我们的单位正交基上。

同时我们注意到:

AlignersHangers=[v1Tv2T][v1v2]=[1001]=E{ Aligners \cdot Hangers = \left[ \begin{matrix} v_{1}^{T} \\ v_{2}^{T} \end{matrix} \right] \cdot \left[ \begin{matrix} v_{1} & v_{2} \end{matrix} \right] = \left[ \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix} \right] = E }

这说明:同一组单位正交基的Aligners和Hangers是互逆的。

Stretchers(伸缩)


Stretchers比较好理解,它是对角阵:

Stretchers=diagnal(λ0,λ1,,λn){ Stretchers = diagnal(\lambda_{0}, \lambda_{1}, \cdots, \lambda_{n}) }

R2{\textbf{R}^{2}}上的一个Stretchers定义为:

[a00b]{\left[ \begin{matrix} a & 0 \\ 0 & b \end{matrix} \right]}

对任意二位平面内的向量[x,y]T{\left[ x,y \right]^{T}},Stretchers对它进行变换有:

[a00b][xy]=[axby]=x[a0]+y[0b]{ \left[ \begin{matrix} a & 0 \\ 0 & b \end{matrix} \right] \cdot \left[ \begin{matrix} x \\ y \end{matrix} \right] = \left[ \begin{matrix} ax \\ by \end{matrix} \right] = x \cdot \left[ \begin{matrix} a \\ 0 \end{matrix} \right] + y \cdot \left[ \begin{matrix} 0 \\ b \end{matrix} \right] }

[a0]=a[10]=ae1[0b]=b[01]=be2{ \left[ \begin{matrix} a \\ 0 \end{matrix} \right] = a \cdot \left[ \begin{matrix} 1 \\ 0 \end{matrix} \right] = a \cdot e_{1} \quad \left[ \begin{matrix} 0 \\ b \end{matrix} \right] = b \cdot \left[ \begin{matrix} 0 \\ 1 \end{matrix} \right] = b \cdot e_{2} }

即Stretchers对应位置上的值对对应维度上的单位正交基进行了放缩。

Coordinate(坐标)


对任意二维平面上的向量p=[x1,x2]T{p=\left[ x_{1}, x_{2} \right]^{T}},首先我们要理解这里给出的坐标实际是p{p}在标准正交基下的坐标,如果我们想求它在单位正交基[v1,v2]{\left[ v_{1},v_{2} \right]}下的坐标:

p=av1+bv2=[v1,v2][ab]=[e1,e2][x1x2]{ p = av_{1} + bv_{2} = \left[ v_{1}, v_{2} \right] \cdot \left[ \begin{matrix} a \\ b \end{matrix} \right] = \left[ e_{1}, e_{2} \right] \cdot \left[ \begin{matrix} x_{1} \\ x_{2} \end{matrix} \right] }

我们用Aligners左乘上面的式子得到:

Alignersp=[v1Tv2T][v1,v2][ab]=[ab]{ Aligners \cdot p = \left[ \begin{matrix} v_{1}^{T} \\ v_{2}^{T} \end{matrix} \right] \left[ v_{1}, v_{2} \right] \cdot \left[ \begin{matrix} a \\ b \end{matrix} \right] = \left[ \begin{matrix} a \\ b \end{matrix} \right] }

上面的式子里[v1,v2]=Hangers{\left[ v_{1}, v_{2} \right] = Hangers},则:

[v1,v2][ab]=[x1x2]=p{ \left[ v_{1}, v_{2} \right] \cdot \left[ \begin{matrix} a \\ b \end{matrix} \right] = \left[ \begin{matrix} x_{1} \\ x_{2} \end{matrix} \right] = p }

我们从以上可以看出:

  • Aligners将向量在标准正交基上的坐标变换到它的单位正交基上的坐标。
  • Hangers将向量在它的单位正交基上的坐标变换到标准正交基上的坐标。

Example (例子)


给定二维平面上的一组单位正交基:

{v1=[22,22]Tv2=[22,22]T{ \left\{ \begin{array}{l} v_{1} = \left[ \frac{\sqrt{2}}{2}, \frac{\sqrt{2}}{2} \right]^T \\ v_{2} = \left[ -\frac{\sqrt{2}}{2}, \frac{\sqrt{2}}{2} \right]^T \end{array} \right. }

求向量p=[3,5]T{p=\left[ 3,5 \right]^{T}}v1{v_{1}}的垂足。


p{p}在x-y轴上对于x轴上的垂足我们很容易得到是[3,0]{\left[ 3,0 \right]},我们只需要令y轴的坐标为0,也就是说我们将一个Stretchers作用于p{p}

[1000]p=[30]{ \left[ \begin{matrix} 1 & 0 \\ 0 & 0 \end{matrix} \right] \cdot p = \left[ \begin{matrix} 3 \\ 0 \end{matrix} \right] }

这个Stretchers保持p{p}在x轴的伸缩尺度为1,在y轴的伸缩尺度为0。

那我们的思路可以是:将p{p}变换到给定的单位正交基上,用该Stretchers作用它,得到垂足在单位正交基上的坐标,再将其变换回x-y坐标系,一系列的变换矩阵A{A}为:

Ap=(Hangers)(Stretchers)(Aligners)p=[22222222][1000][22222222][35]=[44]{ A \cdot p = (Hangers) \cdot (Stretchers) \cdot (Aligners) \cdot p = \left[ \begin{matrix} \frac{\sqrt{2}}{2} & - \frac{\sqrt{2}}{2} \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{matrix} \right] \cdot \left[ \begin{matrix} 1 & 0 \\ 0 & 0 \end{matrix} \right] \cdot \left[ \begin{matrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{matrix} \right] \cdot \left[ \begin{matrix} 3 \\ 5 \end{matrix} \right] = \left[ \begin{matrix} 4 \\ 4 \end{matrix} \right] }

这就是整个的变换过程,也是计算机图像学中几个变换矩阵连续变换的理论,将复杂的变换分解有利于计算。

Singular Value Decomposition (SVD分解)

SVD分解就是这样一个命题:对任意一个m×n{m \times n}的矩阵A{A},存在以下的分解形式:

A=(Hangers)(Stretchers)(Aligners){A = (Hangers) \cdot (Stretchers) \cdot (Aligners) }

SVD的精妙之处在于:它对任意的矩阵都成立,任意的矩阵都有如上的分解形式。

问题是我们如何找到这样的(Hangers)(Stretchers)(Aligners){(Hangers) (Stretchers) (Aligners)}

构造

首先,对任意一个m×n{m \times n}的矩阵A{A},我们可以将它看成是RnRm{\textbf{R}^{n} \rightarrow \textbf{R}^{m}}的变换(线性映射)。我们可以在Rn{\textbf{R}^{n}}里找到一组单位正交基[a1,a2,,an]{\left[ a_{1}, a_{2}, \cdots, a_{n} \right]},而且这样的单位正交基有任意多个。

我们将这组单位正交基通过A{A}投影到另一组向量[d1,d2,,dn]{\left[ d_{1}, d_{2}, \cdots, d_{n} \right]}(注意该向量组共有n个元素,每个元素是m维)。

我们定义标量si=di=Aai{s_{i} = \vert\vert d_{i} \vert\vert = \vert\vert Aa_{i} \vert\vert}

由此我们定义另一组向量 [h1,h2,,hn]{\left[ h_{1}, h_{2}, \cdots, h_{n}\right]},它们满足:

hi={0ifsi=01siAaiifsi0{ h_{i} = \left\{ \begin{array}{cl} \vec{0} & if \quad s_{i} = 0 \\ \frac{1}{s_{i}} A a_{i} & if \quad s_{i} \neq 0 \end{array} \right. }

我们可以发现以下的式子成立:

HSA=[h1,h2,,hn][s1s2sn][a1TanT]=[Aa1,Aa2,,Aan][a1TanT]=A[a1,a2,an][a1Ta2TanT]=A{ \begin{aligned} H \cdot S \cdot A' &= \left[ h_{1}, h_{2}, \cdots, h_{n}\right] \cdot \left[ \begin{matrix} s_{1} & & & \\ & s_{2} & & \\ & & \ddots & \\ & & & s_{n} \\ \end{matrix} \right] \cdot \left[ \begin{matrix} a_{1}^{T} \\ \vdots \\ a_{n}^{T} \end{matrix} \right] \\ & = \left[ Aa_{1}, Aa_{2}, \cdots, Aa_{n}\right] \cdot \left[ \begin{matrix} a_{1}^{T} \\ \vdots \\ a_{n}^{T} \end{matrix} \right] \\ & = A \left[ a_{1}, a_{2} \cdots, a_{n} \right] \left[ \begin{matrix} a_{1}^{T} \\ a_{2}^{T} \\ \vdots \\ a_{n}^{T} \end{matrix} \right] \\ & = A \end{aligned} }

特别注意的是以上的矩阵的大小

H{H}的大小为m×n{m \times n}S{S}的大小为n×n{n \times n},是一个对角阵,同时是一个Stretchers{Stretchers}A{A'}的大小为n×n{n \times n},同时是一个Aligner{Aligner}。只有H{H}不一定是Hanger{Hanger}

基于以上的构造方法,我们发现现在的问题是:寻找合适的Rn{\textbf{R}^{n}}空间的单位正交基[a1,a2,,an]{\left[ a_{1}, a_{2}, \cdots, a_{n} \right]}使得通过以上构造方法得到的H{H}Hanger{Hanger},那我们就得到了对一个矩阵进行SVD分解的三个矩阵,同时证明了任意一个矩阵有SVD分解。

构造Hanger

得到单位正交向量组

要使得向量组[h1,h2,,hn]{\left[ h_{1}, h_{2}, \cdots, h_{n} \right]}构成Hanger{Hanger},当且仅当该向量组也是一组单位正交基。

对任意hi{h_{i}},根据之前的si{s_{i}}的定义,只要si0{s_{i}\neq 0},我们有:

hihi=1si2Aai2=1{ h_{i} \cdot h_{i} = \frac{1}{s_{i}^2} || Aa_{i} ||^{2} = 1 }

剩下的关键就是如何使得hi{h_{i}}正交,即

hihj=0if(ij){ h_{i} \cdot h_{j} = 0 \quad if \quad (i \neq j) }

我们如下推导:

hihj=AaiAaj=(Aai)TAaj=0=aiT(ATAaj){ \begin{aligned} h_{i} \cdot h_{j} &= Aa_{i} \cdot Aa_{j} &= (Aa_{i})^{T}Aa_{j} &= 0 \\ &= a_{i}^{T} (A^{T} Aa_{j}) \end{aligned} }

我们只要令:

ATAaj=λaj{ A^{T}Aa_{j} = \lambda a_{j} }

就可以使得:

aiT(ATAaj)=aiTλaj=0=hihjif(ij){a_{i}^{T}(A^{T} Aa_{j}) = a_{i}^{T}\lambda a_{j} = 0 = h_{i}h_{j} \quad if \quad (i \neq j)}

通过上面的推导,我们发现这唯一的一组正交基正是ATA{A^{T}A}的特征向量[a1,a2,,an]{\left[ a_{1}, a_{2}, \cdots, a_{n} \right]}。而且由于ATA{A^{T}A}是实对称阵,[a1,a2,,an]{\left[ a_{1}, a_{2}, \cdots, a_{n} \right]}一定存在,通过它得到的向量组[h1,h2,,hn]{\left[ h_{1}, h_{2}, \cdots, h_{n} \right]}一定是正交的。

这里我们还有最后一个问题,向量组[h1,h2,,hn]{\left[ h_{1}, h_{2}, \cdots, h_{n} \right]}是否是Rm{\textbf{R}^{m}}的基

基的讨论

首先,由矩阵秩的不等式:

rank(ATA)min(rank(AT),rank(A))=rank(A)min(m,n){rank(A^{T}A) \leq min(rank(A^T), rank(A)) = rank(A) \leq min(m,n)}

如果mn{m \neq n},矩阵ATA{A^{T}A}一定不是满秩,则它一定存在λ=0{\lambda = 0}的特征值,且由于矩阵ATA{A^{T}A}可分解,它的特征值的几何重数等于代数重数,该特征值对应的特征向量的个数等于nrank(ATA){n-rank(A^{T}A)}。我们把这些特征向量记作ci{c_{i}},其中i=1,,nrank(ATA){i=1,\cdots,n-rank(A^{T}A)}

ci{c_{i}},我们有:

ATAci=0{A^{T}Ac_{i}=0}

ciTATAci=0=Aci{c_{i}^{T}A^{T}Ac_{i} = 0 = ||Ac_{i}||}

又根据si{s_{i}}的定义,我们知道这些ci{c_{i}}对应的hi=Aci{h_{i}=Ac_{i}}都是零向量。也就是说向量组[h1,h2,,hn]{\left[ h_{1},h_{2},\cdots,h_{n} \right]}中必定存在至少nrank(ATA){n-rank(A^{T}A)}个零向量。

nrank(ATA)nrank(A)nmin(m,n){n-rank(A^{T}A) \geq n-rank(A) \geq n - min(m,n)}

我们下面分析m,n{m,n}的大小的两种情况:

  • m<n{m < n}

    此时矩阵A{A}就是高维空间向低维空间的映射,它完成了降维的功能。

    如果m<n{m < n},那么向量组[h1,h2,,hn]{\left[ h_{1},h_{2},\cdots,h_{n} \right]}中必定存在至少nm{n-m}个零向量,我们把这些零向量去除,得到至多包含m{m}个向量的向量组[h1,h2,,hm]{\left[ h_{1}, h_{2}, \cdots, h_{m} \right]}

    如果A{A}的秩为m,那么向量组[h1,h2,,hm]{\left[ h_{1}, h_{2}, \cdots, h_{m} \right]}中就不再包含零向量。该向量组包含m个向量,每个向量又是m维的,那么该向量组一定是Rm{\textbf{R}^{m}}的基。

    如果A{A}的秩小于m,那么向量组[h1,h2,,hm]{\left[ h_{1}, h_{2}, \cdots, h_{m} \right]}中仍有零向量,我们仍将他们去除,变成[h1,h2,,hk]{\left[ h_{1}, h_{2}, \cdots, h_{k} \right]},我们将该向量组扩充,向该向量组添加mk{m-k}个互相正交的向量,得到的新的向量组[h1,h2,,hm]{\left[ h_{1}, h_{2}, \cdots, h_{m} \right]}就构成Rm{\textbf{R}^{m}}的基。

  • mn{m \geq n}

    此时矩阵A{A}升维功能。

    此时的分析过程大致和上面的情况相同,向量组[h1,h2,,hn]{\left[ h_{1},h_{2},\cdots,h_{n} \right]}中必定包含至少0个零向量,如果A{A}的秩小于n,我们仍然将对应的零向量去除。无论是否去除零向量,如果向量组中向量的个数小于m,我们仍添加正交的向量使整个向量组包含m个正交向量,这样得到Rm{\textbf{R}^{m}}的基。

总结一下就是:使用之前的构造方法必然得到至多m{m}个正交向量hi{h_{i}},如果向量组个数小于m{m},我们就扩充该向量组,这样必然可以得到Rm{\textbf{R}^{m}}的基。

而且,因为这些扩充的向量对应的si{s_{i}}是0,所以这样的H{H}S,A{S,A'}相乘时仍然可以还原成A{A}

这里还有一个比较值得我们注意的是在SVD分解中三个矩阵的大小,在我们最初的构造过程中我们得到的分解模式

A=HSA{A = H \cdot S \cdot A'}

H{H}的大小为m×n{m \times n}S{S}的大小为n×n{n \times n}A{A'}的大小是n×n{n \times n}

如果我们去掉H{H}列向量组中的零向量,对应的我们去除S{S}中对应的行,我们得到的矩阵大小现在是:H{H}的大小为m×k{m \times k}S{S}的大小为k×n{k \times n}

我们按照前述的得到Rm{\textbf{R}^{m}}的基的方法,如果k<m{k < m}就添加正交向量将H{H}列向量组扩充为m个,并在S{S}的相应位置添加全零行。我们现在得到的矩阵大小是:H{H}的大小为m×m{m \times m}S{S}的大小为m×n{m \times n}A{A'}的大小是n×n{n \times n}。这就得到了我们想要的满足SVD定义的标准分解。

关于SVD最后想说的几点

  • Stretcher{Stretcher}矩阵的大小和矩阵A{A}大小相等。

The dimensions of the stretcher matrix will always match the dimensions of A.

  • 对应关系Hanger{Hanger}矩阵的第i{\textbf{i}}列,对应Stretcher{Stretcher}矩阵的第i{\textbf{i}}行。Stretcher{Stretcher}矩阵的第i{\textbf{i}}列,对应Aligner{Aligner}矩阵的第i{\textbf{i}}行。(废话)也就是如果要删去行列,要遵守这一规则,这将在PCA中有用。

Application of SVD

限于篇幅,有关于SVD分解的应用将在另外的文章中叙述。

比如下面是一个SVD分解的例子,任意给定一个3×3{3 \times 3}的矩阵,它将三维空间的样本变换到相同的三维空间上。

任意三维空间的变换
任意三维空间的变换

但是如果我们对它进行SVD分解,再去掉相应的维度的变换,就可以降低该矩阵的维度,使他将样本变换到二维空间,甚至是一维空间,这就是矩阵降秩(或者说矩阵低秩近似)问题

以下就是将该矩阵降秩到二和一的情况。

降秩到二
降秩到二
降秩到一
降秩到一