在讲SVD之前,我们先来看看计算是如何存储一个灰度图的。计算机用矩形,这个矩形由很多小块组成,这个在图像中是一个像素点,因为表示的是灰度图,所以一共有256种状态,不同数值表示不同的灰度程度。如果一个图像时纯白的,那么其所有像素点数值为255。
如果我们要拷贝一个 m × n m\times n m×n 像素图像时,那一共需要多少次位的操作呢?答:
m × n × 8 m\times n\times8 m×n×8,一个典型的电视一般有 m = 1080 m=1080 m=1080 n = 1920 n=1920 n=1920,对于每一秒都会有24帧这样的像素图,更不用考虑彩色图像了,这个数据量对于传输设备来说是非常昂贵的,那么应该如何使得其更有效率传输?
对于一个视频而言,相邻不大的帧像素之间的变化时不大的,这使得我们只需要传输那些变化的数据,而不是所有的都进行覆写。所有的视频格式都是按照一定的线性代数规则将其变换存储下来的。
压缩一个全黑或者全白的图像是非常容易的:
A = [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] A=\begin{bmatrix} 1&1&1&1&1&1\\ 1&1&1&1&1&1\\ 1&1&1&1&1&1\\ 1&1&1&1&1&1\\ 1&1&1&1&1&1\\ 1&1&1&1&1&1\\ \end{bmatrix} A= 111111111111111111111111111111111111
传输这样一个数据是非常低效的,我们可以将其分解以降低其数据量:
A = [ 1 1 1 1 1 1 ] [ 1 1 1 1 1 1 ] A=\begin{bmatrix} 1\\1\\1\\1\\1\\1 \end{bmatrix}\begin{bmatrix} 1&1&1&1&1&1 \end{bmatrix} A= 111111 [111111]
传输的数据量从原来的 64 64 64 变成了 12 12 12。当然这样的例子是非常极端的,这样的全一矩阵,在处理起来是非常快速的。预设基还是动态调整基(也就是本例)是存在争议的,SVD的方法有时候并不是最高效的。
A = [ a a c c e e a a c c e e a a c c e e a a c c e e a a c c e e a a c c e e ] A=\begin{bmatrix} a&a&c&c&e&e\\ a&a&c&c&e&e\\ a&a&c&c&e&e\\ a&a&c&c&e&e\\ a&a&c&c&e&e\\ a&a&c&c&e&e\\ \end{bmatrix} A= aaaaaaaaaaaacccccccccccceeeeeeeeeeee
改成传输
A = [ 1 1 1 1 1 1 ] [ a a c c e e ] A=\begin{bmatrix} 1\\1\\1\\1\\1\\1 \end{bmatrix}\begin{bmatrix} a&a&c&c&e&e \end{bmatrix} A= 111111 [aaccee]
例子1和例子2的共同之处都是矩阵的秩都为1,且都能写成一列乘以一行
A = [ 1 0 1 1 ] A=\begin{bmatrix}1&0\\1&1\end{bmatrix} A=[1101]
这样的矩阵的秩是2,其中一种分解方法是:
A = [ 1 1 ] [ 1 1 ] − [ 1 0 ] [ 0 1 ] A=\begin{bmatrix}1\\1\end{bmatrix}\begin{bmatrix}1&1\end{bmatrix}-\begin{bmatrix}1\\0\end{bmatrix}\begin{bmatrix}0 &1\end{bmatrix} A=[11][11]−[10][01]
这样的分解不是根据SVD规则选取的,因为列向量和列向量不是正交的,行向量和行向量也不是正交的。如果是按照SVD规则选取的,第二项可能具更小的权重。如何选取出SVD所需要的向量呢?接下来就会对这个进行说明。
大多数图像矩阵对应的特征向量都不是正交的,我们想要找出的是多项“列向量乘以行向量”的和形式,实现对矩阵的分解。SVD是这样完成特征向量的寻找的:
从 A A T AA^T AAT 中获取特征向量 u u u ,从 A T A A^TA ATA 获取特征向量 v v v
A A T AA^T AAT 和 A A T AA^T AAT 是自动对称的,左边的新矩阵获取列向量 u u u,右边的新矩阵获取行向量,更进一步,我们将这些向量进行单位化,也就是 ∣ ∣ u i ∣ ∣ = 1 ||u_i||=1 ∣∣ui∣∣=1 , ∣ ∣ ∣ v i ∣ ∣ = 1 |||v_i||=1 ∣∣∣vi∣∣=1 。单位化不改变原来向量方向,同时为了保持不变,还会多乘以一个系数,我们将其记为 σ i \sigma_i σi。这么一来秩2矩阵 A A A,就可以写成:
A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T A=\sigma_1u_1v_1^T+\sigma_2u_2v_2^T A=σ1u1v1T+σ2u2v2T
其中,单位化的系数 σ 1 \sigma_1 σ1、 σ 2 \sigma_2 σ2表示了这个分量的权重,我们将保留更大的 σ \sigma σ项,忽略那些相对较小的 σ \sigma σ。
我们从以下等式中选取特征向量:
A A T u i = σ i 2 u i A T A v i = σ i 2 v i A v i = σ i u i AA^Tu_i=\sigma_i^2u_i\quad A^TAv_i=\sigma_i^2v_i\quad Av_i=\sigma_iu_i AATui=σi2uiATAvi=σi2viAvi=σiui
例子3:还是前面的矩阵
A = [ 1 0 1 1 ] A=\begin{bmatrix}1&0\\1&1\end{bmatrix} A=[1101]
分别写出 A A T AA^T AAT 和 A T A A^TA ATA 矩阵的结果:
A A T = [ 1 0 1 1 ] [ 1 1 0 1 ] = [ 1 1 1 2 ] AA^T=\begin{bmatrix}1&0\\1&1\end{bmatrix}\begin{bmatrix}1&1\\0&1\end{bmatrix}=\begin{bmatrix}1&1\\1&2\end{bmatrix} AAT=[1101][1011]=[1112]
同理有:
A T A = [ 2 1 1 1 ] A^TA=\begin{bmatrix}2&1\\1&1\end{bmatrix} ATA=[2111]
可以计算对应的特征值为:
λ 1 = 3 + 5 2 λ 2 = 3 − 5 2 \lambda_1=\frac{3+\sqrt{5}}{2}\quad\lambda_2=\frac{3-\sqrt{5}}{2} λ1=23+5λ2=23−5
再对两个特征值进行开根号得到 σ \sigma σ:
σ 1 = 5 + 1 2 σ 2 = 5 − 1 2 \sigma_1=\frac{\sqrt{5}+1}{2}\quad\sigma_2=\frac{\sqrt{5}-1}{2} σ1=25+1σ2=25−1
A A T AA^T AAT和 A T A A^TA ATA对应的特征向量为:
u 1 = [ 1 σ 1 ] u 2 = [ σ 1 − 1 ] v 1 = [ σ 1 1 ] v 2 = [ 1 − σ 1 ] u_1=\begin{bmatrix}1\\\sigma_1\end{bmatrix}\quad u_2=\begin{bmatrix}\sigma_1\\-1\end{bmatrix}\quad v_1=\begin{bmatrix}\sigma_1\\1\end{bmatrix}\quad v_2=\begin{bmatrix}1\\-\sigma_1\end{bmatrix} u1=[1σ1]u2=[σ1−1]v1=[σ11]v2=[1−σ1]
在对其进行单位化,也就是除以 1 + σ 1 2 \sqrt{1+\sigma_1^2} 1+σ12.
OK!有了特征向量和权重,那么我们就可以用式子还原这个矩阵 A A A:
A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T A=\sigma_1u_1v_1^T+\sigma_2u_2v_2^T A=σ1u1v1T+σ2u2v2T111111111111111111111+
写成矩阵形式:
A = [ u 1 u 2 ] [ σ 1 σ 2 ] [ v 1 T v 2 T ] A=\begin{bmatrix}&\\u_1&u_2\\&\end{bmatrix}\begin{bmatrix}\sigma_1&\\&\sigma_2\end{bmatrix}\begin{bmatrix}v_1^T\\v_2^T\end{bmatrix} A= u1u2 [σ1σ2][v1Tv2T]
在处理实际图像时,大多数都是满秩的,使得SVD有意义的原因是我们可以近似替代。
SVD在线性代数中非常重要,因为解决了一个矩阵对角化的缺点:
这节课我们要学的分解就解决了这样一个问题,代价是我们需要两组特征向量 u u u v v v,其中 u u u 属于原矩阵的维数为行个数的空间, v v v属于原矩阵维数为列数的空间。事实上,这些基都涵盖在待分解矩阵 A A A的四个基本子空间中:
让人感到“巧合”的不光是这些基的正交性,更重要是它可将原矩阵对角化:
A v 1 = σ 1 u 1 A v 2 = σ 2 u 2 ⋯ A v r = σ r u r (1) Av_1=\sigma_1 u_1\quad Av_2=\sigma_2 u_2\quad\cdots\quad Av_r=\sigma_ru_r \tag{1} Av1=σ1u1Av2=σ2u2⋯Avr=σrur(1)
σ 1 , ⋯ , σ r \sigma_1,\cdots,\sigma_r σ1,⋯,σr 是一组正数,它被称为奇异值。你可以把它理解为 A v i Av_i Avi的长度,这些奇异值可以写成对角矩阵形式,记为 Σ \Sigma Σ。
[ σ 1 ⋅ ⋅ σ r ] \begin{bmatrix} \sigma_1&\\ & \cdot&\\ &&\cdot&\\ &&&\sigma_r \end{bmatrix} σ1⋅⋅σr
这种将相同矩阵对角化的等式(1)可以写成:
A V r = U r Σ r AV_r=U_r\Sigma_r AVr=UrΣr
也就是:
A [ v 1 ⋯ v r ] = [ u 1 ⋯ u r ] [ σ 1 ⋅ ⋅ σ r ] (2) A\begin{bmatrix}v_1&\cdots& v_r\end{bmatrix}=\begin{bmatrix}u_1&\cdots& u_r\end{bmatrix} \begin{bmatrix} \sigma_1&\\ & \cdot&\\ &&\cdot&\\ &&&\sigma_r \end{bmatrix}\tag{2} A[v1⋯vr]=[u1⋯ur] σ1⋅⋅σr (2)
观察一下矩阵的维数情况:
接下来,我们考虑更加全面一些:
A [ v 1 ⋯ v r ⋯ v n ] = [ u 1 ⋯ u r ⋯ u n ] [ σ 1 ⋅ ⋅ σ r ] (3) A\begin{bmatrix}v_1&\cdots& v_r&\cdots&v_n\end{bmatrix}=\begin{bmatrix}u_1&\cdots& u_r&\cdots&u_n\end{bmatrix} \begin{bmatrix} \sigma_1&\\ & \cdot&\\ &&\cdot&\\ &&&\sigma_r \end{bmatrix}\tag{3} A[v1⋯vr⋯vn]=[u1⋯ur⋯un] σ1⋅⋅σr (3)
这就是我们需要的奇异值分解:
a = U Σ V T = u 1 σ 1 v 1 T + ⋯ + u r σ r v r T a=U\Sigma V^T=u_1\sigma_1v_1^T+\cdots+u_r\sigma_rv_r^T a=UΣVT=u1σ1v1T+⋯+urσrvrT
证明略。