在信息社会中,我们无时无刻都在生产、消费、传输图像和视频数据,数据量的增加对存储和传输上的造成了新的挑战。对于一个1080p的高清图片,其像素点为 1920 × 1080 1920\times1080 1920×1080 ,如果考虑色彩以及视频,存储量更是一个挑战。
如果要存储一个未经压缩的视频,即便是最简单的灰度最简单的灰度信息,每一帧都需要 1920 × 1080 × 8 1920\times1080\times8 1920×1080×8 比特的存储空间,更不要说是彩色图像。因此,对存储对象的矩阵压缩是有必要的。
矩阵压缩是一种数据处理技术,它合理运用矩阵性质,识别并清除数据集中的多余(或不重要的信息)进而减少数据集的规模和复杂度,该技术可以提供数据分析效率。常见的矩阵压缩算法有:
- 奇异值分解(SVD, Singular Value Decomposition)
- 主成分分析(PCA, Principal Component Analysis)
- 稀疏表示
- 低秩表示
对于一个视频而言,有更多的压缩空间。相邻不大的帧像素之间的变化是不大的,这使得我们只需要传输那些变化的数据,而不是所有的都进行覆写。所有的视频格式都是按照一定的线性代数规则将其变换存储下来的。下面我们从图像的角度来了解一下矩阵压缩技术:
一、低秩图像(Low Rank Image)
注:下面的例子都是灰度图像例子。
2.1 例子1
压缩一个全黑或者全白的图像是非常容易的:
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]
传输的数据量从原来的
36
36
36 变成了
12
12
12。当然这样的例子是非常极端的,这样的全一矩阵,在处理起来是非常快速的。预设基还是动态调整基(也就是本例)是存在争议的,SVD的方法有时候并不是最高效的。
2.2 例子2
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,且都能写成一列乘以一行
1.3 例子3
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]
上面将一个矩阵分解为两组“列乘行”的和形式,和例1和例2不同,待分解的矩阵
A
A
A 并不是一个“秩1”矩阵,所以不能表示为一组 “列乘行” 的形式。事实上,这个矩阵
A
A
A 可以通过 SVD 规则进行分解,通过这个规则分解,具有更加明显的特点,某些项具有更小的权重 (对原矩阵
A
A
A 影响较小,可以删除以简化),下面章节的内容将会给出如何进行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
i
u_i
ui,右边的新矩阵获取行向量
v
i
v_i
vi,更进一步,我们将这些向量进行单位化,也就是
∣
∣
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+σ2u2v2T
写成矩阵形式:
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中的基和矩阵
SVD在线性代数中非常重要,因为解决了一个矩阵对角化的缺点:
- 对角化矩阵必须是一个方阵;
- 必须有矩阵维度的特征向量;
- 特征向量不一定是正交的;
这节课我们要学的分解就解决了这样一个问题,代价是我们需要两组特征向量 u u u v v v,其中 u u u 属于原矩阵的维数为行个数的空间, v v v属于原矩阵维数为列数的空间。事实上,这些基都涵盖在待分解矩阵 A A A的四个基本子空间中:
- u 1 , ⋯ , u r u_1,\cdots,u_r u1,⋯,ur 是一组列空间上的正交基;
- u r + 1 , ⋯ , u m u_{r+1},\cdots,u_m ur+1,⋯,um 是一组左零空间上的正交基;
- v 1 , ⋯ , v r v_1,\cdots,v_r v1,⋯,vr 是一组行空间上的正交基;
- v r + 1 , ⋯ , v n v_{r+1},\cdots,v_n vr+1,⋯,vn 是一组零空间的正交基;
让人感到“巧合”的不光是这些基的正交性,更重要是它可将原矩阵对角化:
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 A A 是 m × n m\times n m×n的矩阵
- V V V 是 m × m m\times m m×m的矩阵
- U U U 是 n × n n\times n n×n的矩阵
- Σ \Sigma Σ 是 m × n m\times n m×n的矩阵
接下来,我们考虑更加全面一些:
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
证明略。