logo

奇异值分解

SVD

wangzf / 2022-09-13


目录

特征值和特征向量

特征值和特征向量的定义如下:

Ax=λx

其中:

求出特征值和特征向量的目的是可以将矩阵 A 进行特征分解。 如果求出了矩阵 An 个特征值 λ1λ2,λn, 以及这 n 个特征值对应的特征向量 ω1,ω2,,ωn,那么,矩阵 A 就可以用以下的特征分解形式表示:

A=WΣW1

其中:

一般会把这 n 个特征向量标准化,即满足 ||ωi||2=1,或者 ωiTω=1, 此时 Wn 个特征向量为标准正交基,满足 WTW=I,即 WT=W1,也就是说 W 为酉矩阵。 这样特征分解表达式可以写成:

A=WΣWT

注意到要进行特征分解,矩阵 A 必须为方阵。如果 A 不是方阵,即行和列不相同时,还可以对矩阵进行特征分解吗? 答案是可以,此时 SVD 就是针对这种情况的方案

SVD 介绍

SVD 简介

奇异值分解(Singular Value Decomposition,以下简称 SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解, 还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对 SVD 的原理做一个总结, 并讨论在在 PCA 降维算法中是如何运用运用 SVD 的

SVD 定义

SVD 也是对矩阵进行分解,但是和特征分解不同,SVD 并不要求分解的矩阵为方阵。假设矩阵 A 是一个 m×n 的矩阵, 那么定义矩阵 A 的 SVD 为:

A=UΣVT

其中:

下图可以很形象得看出上面 SVD 的定义:

img

如何求出 SVD 分解后的 UΣV 这三个矩阵?

  1. 如果将 A 的转置和 A 做矩阵乘法,那么会得到 n×n 的一个方阵 ATA。 既然 ATA 是方阵,那么就可以进行特征分解,得到的特征值和特征向量满足下式:

    (ATA)υi=λiυi

    这样就可以得到矩阵 ATAn 个特征值和对应的 n 个特征向量 υ 了。 将 ATA 的所有特征向量张成一个 n×n 的矩阵 V,就是 SVD 公式里面的 V 矩阵了。 一般将 V 中的每个特征向量叫做 A 的右奇异向量

  2. 如果将 AA 的转置做矩阵乘法,那么会得到 m×m 的一个方阵 AAT。 既然 AAT 是方阵,那么就可以进行特征分解,得到的特征值和特征向量满足下式:

    (AAT)ui=λiui

    这样就可以得到矩阵 AATm 个特征值和对应的 m 个特征向量 u 了。 将 AAT 的所有特征向量张成一个 m×m 的矩阵 U,就是 SVD 公式里面的 U 矩阵了。 一般将 U 中的每个特征向量叫做 A 的左奇异向量

  3. 由于 Σ 除了对角线上是奇异值,其他位置都是 0,那么只需要求出每个奇异值 σ 就可以了。 注意到:

    A=UΣVT AV=UΣVTV AV=UΣ Aυi=uiσi σi=Aυiui

    这样就可以求出每个奇异值,进而求出奇异值矩阵 Σ

上面还有一个问题没有讲,就是 ATA 的特征向量组成的就是 SVD 的 V 矩阵, 而 AAT 的特征向量组成的就是 SVD 中的 UU 矩阵,这个有什么根据吗? 这个其实很容易证明,以 V 矩阵的证明为例:

A=UΣVT

AT=VΣUT

ATA=VΣUTUΣVT=VΣ2VT

上式证明使用 UTU=IΣT=Σ, 可以看出 ATA 的特征向量组成的的确就是 SVD 中的 V 矩阵。 类似的方法可以得到 AAT 的特征向量组成的就是 SVD 中的 U 矩阵

进一步,可以看出特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:

σi=λi

这样也就是说,可以不用 σi=Aυiui 来计算奇异值, 也可以通过求出 ATA 的特征值取平方跟来求奇异值

SVD 示例

这里我们用一个简单的例子来说明矩阵是如何进行奇异值分解的。我们的矩阵 A 定义为:

A=(011110)

首先求出 ATAAAT

ATA=(011110)(011110)=(2112)

AAT=(011110)(011110)=(110121011)

进而求出 ATA 的特征值和特征向量:

{λ1=3υ1=(1/21/2)

{λ2=1υ2=(1/21/2)

接着求出 AAT 的特征值和特征向量:

{λ1=3u1=(1/62/61/6)

{λ2=1u2=(1/201/2)

{λ3=0u3=(1/31/31/3)

利用 Aυi=σiui,i=1,2, 求奇异值:

(011110)(1/21/2)=σ1(1/62/61/6)σ1=3

(011110)(1/21/2)=σ2(1/201/2)σ2=1

也可以用 σi=λi 直接求出奇异值为 31

最终得到 A 的奇异值分解为:

A=UΣVT=(1/61/21/32/601/31/61/21/3)(300100)(1/21/21/21/2)

SVD 性质

对于奇异值,它跟特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快, 在很多情况下,前 10% 甚至 1% 的奇异值的和就占了全部的奇异值之和的 99% 以上的比例。 也就是说,也可以用最大的 k 个的奇异值和对应的左右奇异向量来近似描述矩阵,也就是说:

Am×n=Um×mΣm×nVn×nTUm×kΣk×kVk×nT

其中 k 要比 n 小很多,也就是一个大的矩阵 A 可以用三个小矩阵 Um×kΣk×kVk×nT 来表示。如下图所示, 现在矩阵 A 只需要灰色的部分的三个小矩阵就可以近似描述了

img

由于这个重要的性质,SVD 可以用于 PCA 降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解, 进而得到隐含的用户需求来做推荐。同时也可以用于 NLP 中的算法,比如潜在语义索引(LSI)

SVD 在 PCA 中的应用

PCA降维,需要找到样本协方差矩阵 XTX 的最大的 d 个特征向量, 然后用这最大的 d 个特征向量张成的矩阵来做低维投影降维。可以看出, 在这个过程中需要先求出协方差矩阵 XTX,当样本数多样本特征数也多的时候, 这个计算量是很大的

注意到 SVD 也可以得到协方差矩阵 XTX 最大的 d 个特征向量张成的矩阵, 但是 SVD 有个好处,有一些 SVD 的实现算法可以不求先求出协方差矩阵 XTX,也能求出右奇异矩阵 V。 也就是说,PCA 算法可以不用做特征分解,而是做 SVD 来完成。这个方法在样本量很大的时候很有效。 实际上,scikit-learn 的 PCA 算法的背后真正的实现就是用的 SVD,而不是认为的暴力特征分解

另一方面,注意到 PCA 仅仅使用了 SVD 的右奇异矩阵,没有使用左奇异矩阵,那么左奇异矩阵有什么用呢?

假设样本是 m×n 的矩阵 X, 如果通过 SVD 找到了矩阵 XXT 最大的 d 个特征向量张成的 m×d 维矩阵 U, 则如果进行如下处理:

Xd×n=Ud×mTXm×n

可以得到一个 d×n 的矩阵 X,这个矩阵和原来的 m×n 维样本矩阵 X 相比, 行数从 m 减到了 k,可见对行数进行了压缩:

SVD 总结

SVD 作为一个很基本的算法,在很多机器学习算法中都有它的身影,特别是在现在的大数据时代, 由于 SVD 可以实现并行化,因此更是大展身手

SVD 的缺点是分解出的矩阵解释性往往不强,有点黑盒子的味道,不过这不影响它的使用

参考