简述多种降维算法
【转载请注明出处】chenrudan.github.io
最近看了一些关于降维算法的东西,本文首先给出了七种算法的一个信息表,归纳了关于每个算法可以调节的(超)参数、算法主要目的等等,然后介绍了降维的一些基本概念,包括降维是什么、为什么要降维、降维可以解决维数灾难等,然后分析可以从什么样的角度来降维,接着整理了这些算法的具体流程。主要目录如下:
老规矩,先上一个各个算法信息表,XX表示高维输入矩阵大小是高维数D乘以样本个数N,C=XXTC=XXT,ZZ表示降维输出矩阵大小低维数d乘以N,E=ZZTE=ZZT,线性映射是Z=WTXZ=WTX,高维空间中两两之间的距离矩阵为A,Sw,SbSw,Sb分别是LDA的类内散度矩阵和类间散度矩阵,k表示流形学习中一个点与k个点是邻近关系,FF表示高维空间中一个点由周围几个点的线性组合矩阵,M=(I−F)(I−F)TM=(I−F)(I−F)T。−−表示不确定。PP是高维空间中两点距离占所有距离比重的概率矩阵,QQ低维空间中两点距离占所有距离比重的概率矩阵。ll表示全连接神经网络的层数,DlDl表示每一层的节点个数。
这里autoencoder是否去中心化个人觉得还是有点疑问,在处理图像数据的时候,会对输入图片做一个变到0均值的预处理,但是这个操作是针对一张样本内减均值[1],这里的去中心化指的是针对某一维数据减均值,并不是一个概念。下面开始具体谈谈降维相关的内容。
1. 降维基本概念
降维的意思是能够用一组个数为d的向量zizi来代表个数为D的向量xixi所包含的有用信息,其中d<Dd<D。假设对一张512*512大小的图片,用svm来做分类,最直接的做法是将图按照行或者列展开变成长度为512*512的输入向量xixi,跟svm的参数相乘。假如能够将512*512的向量在保留有用信息的情况下降维到100,那么存储输入和参数的空间会减少很多,计算向量乘法的时间也会减少很多。所以降维能够有效的减少计算时间。而高维空间的数据很有可能出现分布稀疏的情况,即100个样本在100维空间分布肯定是非常稀疏的,每增加一维所需的样本个数呈指数级增长,这种在高维空间中样本稀疏的问题被称为维数灾难。降维可以缓解这种问题。
而为什么可以降维,这是因为数据有冗余,要么是一些没有用的信息,要么是一些重复表达的信息,例如一张512*512的图只有中心100*100的区域内有非0值,剩下的区域就是没有用的信息,又或者一张图是成中心对称的,那么对称的部分信息就重复了。正确降维后的数据一般保留了原始数据的大部分的重要信息,它完全可以替代输入去做一些其他的工作,从而很大程度上可以减少计算量。例如降到二维或者三维来可视化。
2. 从什么角度出发来降维
一般来说可以从两个角度来考虑做数据降维,一种是直接提取特征子集做特征抽取,例如从512*512图中只取中心部分,一种是通过线性/非线性的方式将原来高维空间变换到一个新的空间,这里主要讨论后面一种。后面一种的角度一般有两种思路来实现[2],一种是基于从高维空间映射到低维空间的projection方法,其中代表算法就是PCA,而其他的LDA、Autoencoder也算是这种,主要目的就是学习或者算出一个矩阵变换W,用这个矩阵与高维数据相乘得到低维数据。另一种是基于流形学习的方法,流形学习的目的是找到高维空间样本的低维描述,它假设在高维空间中数据会呈现一种有规律的低维流形排列,但是这种规律排列不能直接通过高维空间的欧式距离来衡量,如下左图所示,某两点实际上的距离应该是下右图展开后的距离。如果能够有方法将高维空间中流形描述出来,那么在降维的过程中就能够保留这种空间关系,为了解决这个问题,流形学习假设高维空间的局部区域仍然具有欧式空间的性质,即它们的距离可以通过欧式距离算出(Isomap),或者某点坐标能够由临近的节点线性组合算出(LLE),从而可以获得高维空间的一种关系,而这种关系能够在低维空间中保留下来,从而基于这种关系表示来进行降维,因此流形学习可以用来压缩数据、可视化、获取有效的距离矩阵等。
3. 几种降维方法流程