Python快乐编程:人工智能深度学习基础
上QQ阅读APP看书,第一时间看更新

3.6 奇异值分解

3.5节中探讨了如何将矩阵分解成特征向量和特征值,但特征值分解只适用于方阵,而现实中大部分矩阵都不是方阵,比如电影推荐网站有m个用户,每个用户有n种偏好,这样形成的一个m×n的矩阵,而mn很可能不是方阵,此时可以通过奇异值分解(Singular Value Decomposition,SVD)来对矩阵进行分解。

奇异值分解适用于任意给定的m×n阶实数矩阵分解,它将矩阵分解为奇异向量(Singular Vector)和奇异值(Singular Value),通过奇异向量和奇异值来表述原矩阵的重要特征。除了适用于降维外,奇异值分解还能应用于很多机器学习的工程领域,如图像降噪、购物网站的推荐功能等。

在3.5节中,使用特征分解分析矩阵A时,得到特征向量构成的矩阵V和特征值构成的向量λ,现在通过如下形式重新表示矩阵A

A=Vdiag(λV-1

A是一个m×n的矩阵,U是一个m×m的矩阵,D是一个m×n的矩阵,V是一个n×n矩阵,则矩阵A可以分解为如下形式:

A=UDVT

这些矩阵每一个都拥有特殊的结构。矩阵UV都是正交矩阵,矩阵D是对角矩阵。

矩阵U={u1u2,…,um}是一个m阶方阵,其中ui的值是矩阵ATA的第i大的特征值对应的特征向量。ui也被称为矩阵A的左奇异向量(left singular vector)。

对角矩阵D对角线上的元素为(λ1λ2,…,λk),其中λi是矩阵ATA的第i大的特征值的平方根,被称为矩阵A的奇异值。

矩阵V={v1v2,…,vn}是一个n阶方阵,其中υi的值是矩阵的列向量,被称右奇异向量(Right Singular Vector)。

奇异值分解可以高效地表示数据。例如,假设想传输如图3.11所示的图像,每张图片实际上对应着一个矩阵,像素大小就是矩阵的大小,图中包含15×25个黑色或者白色像素。

可以看出,图3.11实际上是由如图3.12所示的3种类型的列所组成。

图3.11 15×25像素阵列

图3.12 3种类型的列

通过由各元素为0或1的15×25矩阵来表示图3.11,其中,0表示黑色像素,1表示白色像素,矩阵如图3.13所示。

图3.13 图片的矩阵表示

奇异值往往对应着矩阵中隐含的重要信息,其包含信息的重要性与值的大小具有正相关性。每个矩阵都可以表示为一系列秩为1的“子矩阵”之和,通过奇异值来衡量这些“子矩阵”对应的权重。

如果对M进行奇异值分解,可以得到3个非零的奇异值(图3.13中只有3个线性独立的列,因此得到3个奇异值,矩阵的序为3)。假设得到的这3个非零奇异值为σ1σ2σ3。矩阵可以通过如下表达式进行近似表达:

从图3.13中可以看到,该图可以近似由3个包含15个元素的行向量vi,3个包含25个元素的列向量ui,以及3个奇异值σi表达。因此,现在只需要123(3×15+3×25+3=123)个元素就可以表示这个矩阵,远远少于原始矩中的375个元素。

一般情况下,奇异值越大,所对应的信息越重要,这一点可以被应用于数据的降噪处理中。假如,在通过扫描仪将图3.11输入到计算机中可能会因为扫描机的原因在原图上产生一些缺陷,这种缺陷通常被称为“噪声”。这时可以通过奇异值对图像去噪。图3.14是一张扫描后包含噪声的图片。现假设那些较小的奇异值是由噪声引起的,接下来可以通过令这些较小的奇异值为0来达到去除图像噪声的目的。

假设通过奇异值分解得到了矩阵的以下奇异值,由大到小依次为:σ1=14.15,σ2=4.67,σ3=3.00,σ4=0.21,…,σ15=0.05。可以看到,在15个奇异值中,从第4个奇异值开始数值变得较小,这些较小的奇异值便可能是所要剔除的“噪声”。此时,令这些较小奇异值为0,仅保留前3个奇异值来构造新的矩阵,得到如图3.15所示的图像。

图3.14 含有噪声的图像

图3.15 去噪后的图像

与图3.14相比,图3.15的白格子中灰白相间的图案减少了,通过这种对较小的奇异值置0的方法可降低图像噪声。