本文已参与「新人创作礼」活动,一起开启掘金创作之路
在遇到维度灾难的时候,作为数据处理者们最先想到的降维方法一定是SVD(奇异值分解)和PCA(主成分分析)。
两者的原理在各种算法和机器学习的书籍中都有介绍,两者之间也有着某种千丝万缕的联系。
二、PCA
主成分分析是一个优化问题。
借用LittleHann大神的图:
这是一个二维坐标,上面的点是二维上的点,我们现在要用一维来表示这些点,有希望尽可能保留原来的信息,应该怎么办?这就是主成分分析需要解决的问题。
其实,上述问题我们需要解决的无非是找到一组基,使得原来的样本点映射到这组基上的距离足够近(最近重构性),且样本点在这组基上的投影尽可能分开(最大可分性)。
2.1 最大化方差
最大可分性需要是的样本点在新基上的投影尽可能分开,这种分散程度在数学上我们可以用样本点的方差来表示。方差越大,表示分散程度越大。此处,一个维度基上各样本点投影的方差可以看做是每个元素与字段均值的差的平方和的均值,即
Var(a)=1m∑mi=1(ai−μ)2Var(a)=1m∑i=1m(ai−μ)2
所以,在进行PCA之前,我们需要把样本矩阵进行均值化,这样上式可以变为
Var(a)=1m∑mi=1a2iVar(a)=1m∑i=1mai2
2.2 最小化协方差
对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。但是对于高维问题来说,比如从三维到二维,如果我们单纯只选择方差最大的方向,很明显,第二个选择的维度与第一个维度应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让不同尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个维度不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
Cov(a,b)=1m∑mi=1aibiCov(a,b)=1m∑i=1maibi
所以,在维度均值为0的情况下,两个维度的协方差表示为其内积除以元素数m。
当协方差为0时,表示两个维度的字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。至此,我们得到了降维问题的优化目标:
将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0(各自独立),而字段的方差则尽可能大(投影后的点尽可能离散)。在正交的约束下,取最大的K个方差
2.3 协方差矩阵
对于2.1和2.2的两个优化目标(最大化方差,最小化协方差),都可以用一个矩阵来实现,这就是协方差矩阵。
假设一个二维空间,共有m个样本,按列组成矩阵X
然后用X乘X的转置,得到协方差矩阵
对角线是基上每个维度样本投影的方差,非对角线上是不同两个维度之间的字段的协方差。当前协方差矩阵是样本在原来的正交基上的情况。很明显,由于协方差不为0,所以这个分布是有冗余的。我们的目标就是找到另一组基,使得同样的这些样本在那组基上可以达到方差最大,协方差最小。
这就需要对当前协方差矩阵进行对角化了。由于协方差矩阵是对称矩阵,必然可以找到矩阵P,令Y=PXY=PX,使得:
D=1mYYT=1m(PX)(PX)T=P(1mXXT)PT=PCPTD=1mYYT=1m(PX)(PX)T=P(1mXXT)PT=PCPT
其中C为原来的协方差矩阵,经过对角化之后得到D矩阵,且D矩阵的非对角线元素全为0,所以我们的优化目标优变为:
优化目标变成了寻找一个矩阵P,满足PCPTPCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件
所以主成分分析的步骤为:
- 设有m条n维数据,组成Xn×mXn×m矩阵
- 对所有样本进行中心化
- 计算样本的协方差矩阵
- 对协方差矩阵进行特征值分解
- 取最大的k个特征值所对应的特征向量构成矩阵P
- Y=PX 即为降维到k维后的数据
最后,送上这张经典的图:
三、SVD与PCA区别与联系
3.1 从目的上来说:
SVD是一种矩阵分解方法,相当于因式分解,他的目的纯粹就是将一个矩阵拆分成多个矩阵相乘的形式。
PCA从名字上就很直观,找到矩阵的主成分,也就意味这从一出生这就是个降维的方法。
3.2 从方法上来说:
PCA在过程中要计算协方差矩阵,当样本数和特征数很多的时候,这个计算量是相当大的。
注意到SVD也可以得到协方差矩阵 XTXXTX 最大的k个特征向量张成的矩阵,但是SVD有个好处,有一些SVD的实现算法可以不求先求出协方差矩阵XTXXTX,也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解,而是做SVD来完成。
另一方面,A的奇异值分解迭代计算比协方差矩阵的特征值分解更快更准确。
注意到PCA仅仅使用了SVD的右奇异矩阵V,没有使用左奇异矩阵U,那么左奇异矩阵有什么用呢?
假设我们的样本是m✖️n的矩阵X,如果我们通过SVD找到了矩阵 XTXXTX 的最大的k个特征向量组成的m✖️d维矩阵U,则我们进行如下处理:
X′d×n=UTd×mXm×nXd×n′=Ud×mTXm×n
可以得到一个d✖️n的矩阵X',且这个矩阵和我们原来的m✖️n维的样本矩阵X相比,行数从m剪到了k,可见对行数进行了压缩。
也就是说,左奇异矩阵可以用于行数的压缩。相对的,右奇异矩阵可以用于列数即特征维度的压缩,也就是我们的PCA降维。
换句话说,SVD可以获取另一个方向上的主成分,而PCA只能获得单个方向上的主成分。这一点在NLP的文本处理上得到了很大体现。
3.3 从操作上来说:
下面来看sklearn手册
这是 sklearn.decomposition.PCA 的 fit_transform() 操作:
这是 sklearn.decomposition.TruncatedSVD 的 fit_transform() 操作:
看到两者的区别了嘛?两者在输出上都是一样的,唯一的区别在输入,SVD可以输入稀疏矩阵(sparse matrix)。在原理上,也可以说SVD更适于输入稀疏矩阵。
因为PCA需要进行去均值化处理,所以不可避免的破坏了矩阵的稀疏性。所以,对于稀疏矩阵来说,SVD更适用,这样对于大数据来说节省了很大空间。
Reference:
- 《线性代数及其应用》. David C Lay
- blog.csdn.net/zhongkejing…
- www.cnblogs.com/LittleHann/… (强烈推荐)
- my.oschina.net/findbill/bl…
- www.cnblogs.com/pinard/p/62…
- blog.csdn.net/wangjian120…
- 《机器学习》. 周志华