为什么PCA中奇异值分解(SVD)和特征分解可以降低数据维度?

本文特征分解的思想与奇异值分解类似,以奇异值分解为例。

网上有很多文章都说明了SVD的原理,最终说选取奇异值最大的k个就可以了(没说原因),并给出了这样一个公式:

A_{m\times n}=U_{m\times m}\Sigma_{m\times n} V_{n\times n}^{T}\approx U_{m\times k}\Sigma_{k\times k} V_{k\times n}^{T}

U\SigmaV分别表示A矩阵的左奇异矩阵,奇异值对角矩阵和右奇异矩阵。笔者读到这里的时候想到,为什么这样是可行的?为什么选取前几个奇异值很大的矩阵就可以了?

事实上,\Sigma_{m\times n}的格式是这样的:\Sigma_{m\times n}=\begin{bmatrix} \sigma_{1}& 0& 0 & ...... & 0\\ 0& \sigma_{2} &0 & ...... &0 \\ 0& 0 & \sigma_{3} & ...... &0 \\ 0&0 &0 & ......&0 \\ 0& 0& 0 & ...... &\sigma_{n} \\ ...&... &... &...... & ...& \\ 0&0 &0&0 & 0& \end{bmatrix}(对于大多数数据集而言,m>n即样本数量大于特征值,因此考虑这种情况。另外再插一句,numpy中奇异值是以array类型返回的,因为除了对角线上都是0,考虑到节省空间,使用一维数组来表示)。其中,\sigma_{1}\sigma_{2}、...、\sigma_{n}表示奇异值并且按照从大到小排列

根据矩阵加法,我们把\Sigma_{m\times n}拆解成

\Sigma_{m\times n}=\Sigma_{1}+\Sigma_{2}+...+\Sigma_{n} \\= \begin{bmatrix} \sigma_{1}& 0& 0 & ...... & 0\\ 0& 0 &0 & ...... &0 \\ 0& 0 & 0& ...... &0 \\ 0&0 &0 & ......&0 \\ 0& 0& 0 & ...... &0 \\ ...&... &... &...... & ...& \\ 0&0 &0&0 & 0& \end{bmatrix}+\begin{bmatrix} 0& 0& 0 & ...... & 0\\ 0& \sigma_{2} &0 & ...... &0 \\ 0& 0 & 0& ...... &0 \\ 0&0 &0 & ......&0 \\ 0& 0& 0 & ...... &0 \\ ...&... &... &...... & ...& \\ 0&0 &0&0 & 0& \end{bmatrix}+......+\begin{bmatrix}0& 0& 0 & ...... & 0\\ 0& 0 &0 & ...... &0 \\ 0& 0 & 0& ...... &0 \\ 0&0 &0 & ......&0 \\ 0& 0& 0 & ...... &\sigma_{n} \\ ...&... &... &...... & ...& \\ 0&0 &0&0 & 0& \end{bmatrix}

根据矩阵乘法分配律

\begin{aligned}A_{m\times n}=U_{m\times m}\Sigma_{m\times n} V_{n\times n}^{T} &=U_{m\times m}(\Sigma_{1}+\Sigma_{2}+...+\Sigma_{n}) V_{n\times n}^{T} \\&=U_{m\times m}\Sigma_{1} V_{n\times n}^{T}+U_{m\times m}\Sigma_{2} V_{n\times n}^{T}+...+U_{m\times m}\Sigma_{n} V_{n\times n}^{T} \end{aligned}

因此,可以看成是矩阵相乘的线性组合,系数(也可以说成是权重)就是\Sigma_{1}\Sigma_{2}、...、\Sigma_{n}。一般来说,矩阵A的前几个奇异值权重之和就快要接近1,说明矩阵A的产生主要是受到了前几项的影响。想象一下,如果\sigma_{1}=999\sigma_{n}=0.00001(前面已经说到这是从大到小排列的),可以认为U_{m\times m}\Sigma_{n} V_{n\times n}^{T}这一项对矩阵的贡献几乎为0,因此将其舍去。

这也就解释了,在PCA算法中,我们需要选择奇异值较大的前k个项,因为前k个的奇异值比重已经占到了大部分,后面的项对矩阵的贡献已经微乎其微了,相较于维度上的代价,还是把这些项丢掉吧。

那么,当我选择奇异值较大的前k个项时,由于

U_{m\times m}\Sigma_{k+1} V_{n\times n}^{T}+U_{m\times m}\Sigma_{k+2} V_{n\times n}^{T}+...+U_{m\times m}\Sigma_{n} V_{n\times n}^{T}\approx 0

所以

\begin{aligned} &U_{m\times m}\Sigma_{1} V_{n\times n}^{T}+U_{m\times m}\Sigma_{2} V_{n\times n}^{T}+...+U_{m\times m}\Sigma_{n} V_{n\times n}^{T} \\ \approx &U_{m\times m}\Sigma_{1} V_{n\times n}^{T}+U_{m\times m}\Sigma_{2} V_{n\times n}^{T}+...+U_{m\times m}\Sigma_{k} V_{n\times n}^{T} \\ =&U_{m\times m}(\Sigma_{1}+\Sigma_{2}+...+\Sigma_{k}) V_{n\times n}^{T} \\ =&U_{m\times m}\Sigma_{new} V_{n\times n}^{T}\end{aligned}

然后,由于\Sigma_{new}中有很多0的存在,这些0乘上两边的矩阵也是0,因此可以把\Sigma_{new}简化成一个k×k的对角方阵\Sigma_{k},该矩阵对角线上的值为\sigma_{1}\sigma_{k},其余是0。U_{m\times m}取前k列,V_{n\times n}^{T}取前k行,这么取的原因是U_{m\times m}的第k+1列上的值最终与\Sigma_{new}的第k+1行上的值相乘,而后者都是0。V_{n\times n}^{T}同理。

最后我们得到

U_{m\times m}\Sigma_{new} V_{n\times n}^{T}=U_{m\times k}\Sigma_{k\times k} V_{k\times n}^{T}

综上所述,有

A_{m\times n}=U_{m\times m}\Sigma_{m\times n} V_{n\times n}^{T}\approx U_{m\times k}\Sigma_{k\times k} V_{k\times n}^{T}

我得到了这个公式,那到底怎么降维呢?

先来说一说矩阵乘法,对于矩阵乘法AB=C,我们可以有如下理解:这里假设

A_{m\times n}=\begin{bmatrix} ---a_{1}--- \\ ---a_{2}--- \\ ---a_{3}--- \\ ---....---\\ ---a_{m}--- \end{bmatrix}B_{n\times k}=\begin{bmatrix} | &|&|&|&| \\ | &|&|&|&| \\ b_{1} & b_{2}& b_{3}& ...& b_{k} \\ | &|&|&|&| \\ | &|&|&|&| \\ \end{bmatrix}(b1、b2、...bk是单位向量,即\begin{Vmatrix} b_{i} \end{Vmatrix}=1,i=1、2、...k)

那么C就可以表示成

C_{m\times k}=\begin{bmatrix} a_{1}b_{1}& a_{1}b_{2} & a_{1}b_{3} & ... & a_{1}b_{k}\\ a_{2}b_{1}& a_{2}b_{2} & a_{2}b_{3} & ... & a_{2}b_{k}\\ & & ... & & \\ a_{m}b_{1}& a_{m}b_{2} & a_{m}b_{3} & ... & a_{m}b_{k}\\ \end{bmatrix} = \begin{bmatrix} ---c_{1}---\\ ---c_{2}---\\ ... \\ ---c_{k}---\\ \end{bmatrix}

为什么要提及这个?因为我们可以把a_{i}(i=1......m)看做是n维空间的n维向量,把b_{j}(j=1...k)看做是n维空间的k个基向量,那么c_{p}(p=1...k)就是以b_{1}b_{2}、...、b_{k}为基的新坐标表示的向量。这里就完成了数据的压缩。如果你还不明白,想一想\frac{a_{1}b_{1}}{\begin{Vmatrix} b_{1} \end{Vmatrix}}是什么?是向量a_{1}b_{1}方向上的投影长度,因为我已经让\begin{Vmatrix} b_{i} \end{Vmatrix}=1 ,所以\frac{a_{1}b_{1}}{\begin{Vmatrix} b_{1} \end{Vmatrix}}=a_{1}b_{1},这个就是a_{1}b_{1}方向上投影的坐标大小,而不在b_{1}方向上的投影(就是与b_{1}正交的方向上的投影),则被丢失(也就是数据被压缩了)。

举个例子,假设A=\begin{bmatrix} 1 &1 \\ 2 & 1\\ -1 & -2\end{bmatrix},在一个二维坐标系上表示就是点(1,1),点(2,1)和点(-1,0),读者可以自己找张纸画一下。我希望把数据从二维压缩成一维,我需要找一个新基,假设这个新基b_{1}=(0,1),那么上述三个点投影到这个新基的坐标就是

AB=\begin{bmatrix} 1 &1 \\ 2 & 1\\ -1 & -2\end{bmatrix}\begin{bmatrix} 0\\ 1 \end{bmatrix}=\begin{bmatrix} 1 \\1\\-2 \end{bmatrix},这三个点的新坐标就是(1),(1),(-2),这个基比较特殊,就是原来的y方向,读者也可以换个基再试试。

说了一大堆,回到SVD上面来,我们已经认可了下面这个等式

A_{m\times n}\approx U_{m\times k}\Sigma_{k\times k} V_{k\times n}^{T}

不妨把不等号改成等号,两边先后右乘上(V_{k\times n}^{T})^{-1}(\Sigma_{k\times k})^{-1},原式可变为

A_{m\times n} (V_{k\times n}^{T})^{-1}(\Sigma_{k\times k})^{-1}=U_{m\times k}

又因为矩阵V是单位正交矩阵,有V^{-1}=V^{T},所以上式可写成

A_{m\times n} V_{n\times k}(\Sigma_{k\times k})^{-1}=U_{m\times k}

这里A_{m\times n} V_{n\times k}就是把原有数据集从n维投影到了k维空间上,获得了新的坐标,再乘以一个对角矩阵,此时将该对角矩阵视为某种线性变换(通常而言,线性变换是指左乘一个矩阵,那是因为原始矩阵是以行数来作为维度,即如果有2行,那维度就是2,从而对行线性变换。而这里是以列的数目作为维度,因此右乘一个线性变换矩阵相当于对原始矩阵的列做线性变换),即相当于对坐标进行伸缩。伸缩程度取决于奇异值,但无论如何,数据成功被压缩到了k维空间上。

猜你喜欢

转载自blog.csdn.net/qq_41987033/article/details/81211574