奇异值分解
SVD
wangzf / 2022-09-13
特征值和特征向量
特征值和特征向量的定义如下:
其中:
- 是一个 矩阵
- 是矩阵 的一个特征值
- 是矩阵 的特征值 对应的特征向量, 是一个 维向量
求出特征值和特征向量的目的是可以将矩阵 进行特征分解。 如果求出了矩阵 的 个特征值 , 以及这 个特征值对应的特征向量 ,那么,矩阵 就可以用以下的特征分解形式表示:
其中:
- 是 个特征向量所张成的 维矩阵
- 是 个特征值为主对角线的 维矩阵
一般会把这 个特征向量标准化,即满足 ,或者 , 此时 的 个特征向量为标准正交基,满足 ,即 ,也就是说 为酉矩阵。 这样特征分解表达式可以写成:
注意到要进行特征分解,矩阵 必须为方阵。如果 不是方阵,即行和列不相同时,还可以对矩阵进行特征分解吗? 答案是可以,此时 SVD 就是针对这种情况的方案
SVD 介绍
SVD 简介
奇异值分解(Singular Value Decomposition,以下简称 SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解, 还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。本文就对 SVD 的原理做一个总结, 并讨论在在 PCA 降维算法中是如何运用运用 SVD 的
SVD 定义
SVD 也是对矩阵进行分解,但是和特征分解不同,SVD 并不要求分解的矩阵为方阵。假设矩阵 是一个 的矩阵, 那么定义矩阵 的 SVD 为:
其中:
- 是一个 的矩阵
- 是一个 的矩阵,除了主对角线上的元素以外,全为 0,主对角线上的每个元素都称为奇异值
- 是一个 的矩阵
- 和 都是酉矩阵,即满足 ,
下图可以很形象得看出上面 SVD 的定义:
如何求出 SVD 分解后的 、、 这三个矩阵?
-
如果将 的转置和 做矩阵乘法,那么会得到 的一个方阵 。 既然 是方阵,那么就可以进行特征分解,得到的特征值和特征向量满足下式:
这样就可以得到矩阵 的 个特征值和对应的 个特征向量 了。 将 的所有特征向量张成一个 的矩阵 ,就是 SVD 公式里面的 矩阵了。 一般将 中的每个特征向量叫做 的右奇异向量
-
如果将 和 的转置做矩阵乘法,那么会得到 的一个方阵 。 既然 是方阵,那么就可以进行特征分解,得到的特征值和特征向量满足下式:
这样就可以得到矩阵 的 个特征值和对应的 个特征向量 了。 将 的所有特征向量张成一个 的矩阵 ,就是 SVD 公式里面的 矩阵了。 一般将 中的每个特征向量叫做 的左奇异向量
-
由于 除了对角线上是奇异值,其他位置都是 0,那么只需要求出每个奇异值 就可以了。 注意到:
这样就可以求出每个奇异值,进而求出奇异值矩阵
上面还有一个问题没有讲,就是 的特征向量组成的就是 SVD 的 矩阵, 而 的特征向量组成的就是 SVD 中的 的 矩阵,这个有什么根据吗? 这个其实很容易证明,以 矩阵的证明为例:
上式证明使用 ,, 可以看出 的特征向量组成的的确就是 SVD 中的 矩阵。 类似的方法可以得到 的特征向量组成的就是 SVD 中的 矩阵
进一步,可以看出特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
这样也就是说,可以不用 来计算奇异值, 也可以通过求出 的特征值取平方跟来求奇异值
SVD 示例
这里我们用一个简单的例子来说明矩阵是如何进行奇异值分解的。我们的矩阵 定义为:
首先求出 和 :
进而求出 的特征值和特征向量:
接着求出 的特征值和特征向量:
利用 求奇异值:
也可以用 直接求出奇异值为 和
最终得到 的奇异值分解为:
SVD 性质
对于奇异值,它跟特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快, 在很多情况下,前 10% 甚至 1% 的奇异值的和就占了全部的奇异值之和的 99% 以上的比例。 也就是说,也可以用最大的 个的奇异值和对应的左右奇异向量来近似描述矩阵,也就是说:
其中 要比 小很多,也就是一个大的矩阵 可以用三个小矩阵 、 、 来表示。如下图所示, 现在矩阵 只需要灰色的部分的三个小矩阵就可以近似描述了
由于这个重要的性质,SVD 可以用于 PCA 降维,来做数据压缩和去噪。也可以用于推荐算法,将用户和喜好对应的矩阵做特征分解, 进而得到隐含的用户需求来做推荐。同时也可以用于 NLP 中的算法,比如潜在语义索引(LSI)
SVD 在 PCA 中的应用
PCA降维,需要找到样本协方差矩阵 的最大的 个特征向量, 然后用这最大的 个特征向量张成的矩阵来做低维投影降维。可以看出, 在这个过程中需要先求出协方差矩阵 ,当样本数多样本特征数也多的时候, 这个计算量是很大的
注意到 SVD 也可以得到协方差矩阵 最大的 个特征向量张成的矩阵, 但是 SVD 有个好处,有一些 SVD 的实现算法可以不求先求出协方差矩阵 ,也能求出右奇异矩阵 V。 也就是说,PCA 算法可以不用做特征分解,而是做 SVD 来完成。这个方法在样本量很大的时候很有效。 实际上,scikit-learn 的 PCA 算法的背后真正的实现就是用的 SVD,而不是认为的暴力特征分解
另一方面,注意到 PCA 仅仅使用了 SVD 的右奇异矩阵,没有使用左奇异矩阵,那么左奇异矩阵有什么用呢?
假设样本是 的矩阵 , 如果通过 SVD 找到了矩阵 最大的 个特征向量张成的 维矩阵 , 则如果进行如下处理:
可以得到一个 的矩阵 ,这个矩阵和原来的 维样本矩阵 相比, 行数从 减到了 ,可见对行数进行了压缩:
- 左奇异矩阵可以用于行数的压缩
- 右奇异矩阵可以用于列数即特征维度的压缩,也就是 PCA 降维
SVD 总结
SVD 作为一个很基本的算法,在很多机器学习算法中都有它的身影,特别是在现在的大数据时代, 由于 SVD 可以实现并行化,因此更是大展身手
SVD 的缺点是分解出的矩阵解释性往往不强,有点黑盒子的味道,不过这不影响它的使用