SVD分解及应用

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

SVD的定义

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

其中 $U$ 是一个 $m \times m$ 的矩阵,$\Sigma$ 是一个 $m \times n$ 的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,$V$ 是一个 $n \times n$ 的矩阵。$U$ 和 $V$ 都是酉矩阵,即满足 $U^TU=I, V^TV=I$。下图可以很形象的看出上面SVD的定义:

image

因为 $U$ 和 $V$ 都是酉矩阵,所以 $U$ 和 $V$ 的列向量分别张成 $K^{m}$ 和 $K^{n}$ 的一组标准正交基。我们将 $U$ 的列向量记作 $\vec u_i,\; 1 \leqslant i\leqslant m$;将 $V$ 的列向量记作 $\vec v_j,\; 1\leqslant j\leqslant n$;同时,将 $\Sigma$ 对角线上的第 $i$ 个元素记作 $\sigma_k,\; 1\leqslant k\leqslant\min(m,n)$。那么,SVD 分解实际可以将矩阵 $A$ 写作一个求和形式

那么我们如何求出 SVD 分解后的 $U, \Sigma, V$ 这三个矩阵呢?

现在,假设矩阵 $A_{m\times n}$ 的 SVD 分解是 $A = U\Sigma V^{\mathsf T}$,那么,我们有

这也就是说,$U$ 的列向量(左奇异向量),是 $M M^{\mathsf T}$ 的特征向量;同时, $V$ 的列向量(右奇异向量),是 $M^{\mathsf T} M$ 的特征向量;另一方面, $M$ 的奇异值($\Sigma$ 的非零对角元素)则是 $M M^{\mathsf T}$ 或者 $M^{\mathsf T} M$ 的非零特征值的平方根。

SVD的计算

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

我们首先求出 $A^TA和AA^T$

进而求出 $A^TA$ 的特征值和特征向量:

接着求 $AA^T$ 的特征值和特征向量:

利用 $Av_i = \sigma_i u_i, i=1,2$ 求奇异值:

当然,我们也可以用 $\sigma_i = \sqrt{\lambda_i}$ 直接求出奇异值为 $\sqrt{3}$ 和1。

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

SVD的性质

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

其中 $k$ 要比 $n$ 小很多,也就是一个大的矩阵 $A$ 可以用三个小的矩阵 $U_{m \times k},\Sigma_{k \times k} ,V^T_{k \times n}$ 来表示。如下图所示,现在我们的矩阵 $A$ 只需要灰色的部分的三个小矩阵就可以近似描述了。

image

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

SVD用于PCA

在主成分分析(PCA)原理总结中,我们讲到要用PCA降维,需要找到样本协方差矩阵 $X^TX$ 的最大的 $d$ 个特征向量,然后用这最大的 $d$ 个特征向量张成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵 $X^TX$,当样本数多样本特征数也多的时候,这个计算量是很大的。

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

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

假设我们的样本是 $m \times n$ 的矩阵 $X$,如果我们通过 SVD 找到了矩阵 $XX^T$ 最大的 $d$ 个特征向量张成的 $m \times d$ 维矩阵 $U$,则我们如果进行如下处理:

可以得到一个 $d \times n$ 的矩阵 $X’$,这个矩阵和我们原来的 $m \times n$ 维样本矩阵 $X$ 相比,行数从 $m$ 减到了 $k$,可见对行数进行了压缩。也就是说,左奇异矩阵可以用于行数的压缩。相对的,右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的 PCA 降维。

更多svd几何方面的解释,请移步We Recommend a Singular Value Decomposition

本文转自奇异值分解

持续技术分享,您的支持将鼓励我继续创作!