维数约减.docx
《维数约减.docx》由会员分享,可在线阅读,更多相关《维数约减.docx(17页珍藏版)》请在冰豆网上搜索。
维数约减
机器学习应用到各个领域里,会遇到许多不同类型的数据要处理:
图像、文本、音频视频以及物理、生物、化学等实验还有其他工业、商业以及军事上得到的各种数据,如果要为每一种类型的数据都设计独立的算法,那显然是非常不现实的事,因此,机器学习算法通常会采用一些标准的数据格式,最常见的一种格式就是每一个数据对应欧几里德空间里的一个向量。
如果原始的数据格式不兼容,那么就需要首先进行转换,这个过程通常叫做“特征提取”(FeatureExtraction),而得到的标准数据格式通常叫做Feature。
例如,一个最简单的将一个文本Document转化为向量的方法如下:
1.选定特征空间,这里采用三维欧氏空间,三个维度(依次)分别由to、be和the表示。
2.假设待提取的文档是“Tobe,ornottobe:
thatisthequestion:
”,首先对其进行一些预处理,例如去掉单词的时态后缀、滤掉标点符号等,得到“tobeornottobethatbethequestion”。
3.统计三个维度所对应的单词出现的频率:
to2次,be3次,the1次。
4.该文档对应的向量即[2,3,1]。
当然,在实际中我们几乎不会这样人工设定空间的各个维度所对应的单词,而通常是从一个数据集中统计出所有出现的词,再将其中的一些挑选出来作为维度。
怎样挑选呢?
最简单的办法是根本不做任何挑选,或者简单地只是把出现频率太低的单词(维度)去掉。
不过,事实上我们通常会做更复杂一些的处理,例如,如果你是在做sentimentanalysis,那么你通常会更加关注语气很重的词,比如“bad”、“terrible”、“awesome”等的重要性就比普通的词要大,此时你可以为每一个维度设一个权重,例如,给“bad”设置权重2,那么出现3次的话,向量在该维度对应的值就为2*3=6。
当然这样手工指定权重只在小范围内可行,如果要为数百万个维度指定权重,那显然是不可能的,另一个稍微自动一点的办法是tf-idf。
tf就是TermFrequency,就和刚才说的单词出现的次数差不多,而idf则是InverseDocumentFrequency,通常使用如下公式进行计算:
这相当于自动计算出来的每个单词的权重,其想法很简单:
如果在许多文档中都出现的词(例如虚词、语气词等),它所包含的信息量通常会比较小,所以用以上的公式计算出来的权重也会相对较小;另一方面,如果单词并不是在很多文档中都出现的话,很有可能就是出现的那些文档的重要特征,因此权重会相对大一些。
前面说了一堆,其实主要是想要对feature做一些“预”处理,让它更“好”一些,手工设置维度的权重固然是很人力,其实tf-idf也是在假定了原始feature是document、term这样的形式(或者类似的模型)的情况下才适用的(例如,在门禁之类的系统里,feature可能有声音、人脸图像以及指纹等数据,就不能这样来处理),因此也并不能说是一种通用的方法。
然而,既然机器学习的算法可以在不考虑原始数据的来源和意义的情况下工作,那么feature的处理应该也可以。
事实也是如此,包括featureselection和dimensionalityreduction两个topic都有许多很经典的算法。
前者通常是选出重要的feature的维度(并抛弃不重要的维度),而后者则是更广泛意义上的把一个高维的向量映射为一个低维向量,亦即“降维”,得到的结果feature的值已经不一定是原始的值,也可以把featureselection看作是dimensionalityreduction的一种特殊情况。
举一个例子,tf-idf实际上不算featureselection,因为它(通常)并没有丢弃低权值的维度,并且处理过后的特征的每个维度都被乘上了一个权值,不再是原来的值了;但是它却可以被看作一种降维,虽然严格意义上来说维度并没有“降低”。
简单来说降维可以看作一个函数,其输入是一个D维的向量,输出是一个M维的向量。
按照机器学习的方法的一贯作风,我们需要定义目标函数并进行最优化。
不同的目标也就导致了不同的降维算法,这也正是今天要讲的话题。
然而,我们的目的究竟是什么呢?
一个比较直接的问题是原始的数据量维度太高,我们无法处理,因此需要降维,此时我们通常希望在最大限度地降低数据的维度的前提下能够同时保证保留目标的重要的信息,就好比在做有损的数据压缩时希望压缩比尽量大但是质量损失不要太多。
于是问题又转化为如何衡量对信息的保留程度了。
一个最直接的办法就是衡量reconstructionerror,即
其中
是
所对应的低维表示再重新构造出来的高维形式,就相当于是压缩之后解压出来的结果,不过虽然有许多压缩方法都是无损的,就是说这个差值会等于零,但是大部分降维的结果都是有损的。
不过我们仍然希望把上面的reconstructionerror最小化。
另外一种方式是简单地使用variance来衡量所包含信息量,例如,我们要把一些D维的向量降为1维,那么我们希望这一维的variance达到最大化,亦即:
其中
是降维函数。
推而广之,如果是降为2维,那么我希望第2维去关注第1维之外的variance,所以要求它在与第一维垂直的情况下也达到variance最大化。
以此类推。
然而,当我们把降维函数
限定维线性的时候,两种途径会得到同样的结果,就是被广泛使用的PrincipalComponentsAnalysis(PCA)。
PCA的降维函数是线性的,可以用一个
维的矩阵
来表示,因此,一个D维的向量
经过线性变换
之后得到一个M维向量,就是降维的结果。
把原始数据按行排列为一个
维的矩阵
,则
就是降维后的
维的数据矩阵,目标是使其covariance矩阵最大。
在数据被规则化(即减去其平均值)过的情况下,协方差矩阵(covariance)
,当然矩阵不是一个数,不能直接最大化,如果我们采用矩阵的Trace(亦即其对角线上元素的和)来衡量其大小的话,要对
求最大化,只需要求出
的特征值和特征向量,将M个最大的特征值所对应的特征向量按列排列起来组成线性变换矩阵
即可。
这也就是PCA的求解过程,得到的降维矩阵
可以直接用到新的数据上。
如果熟悉LatentSemanticAnalysis(LSA)的话,大概已经看出PCA和SingularValueDecomposition(SVD)以及LSA之间的关系了。
以下这张图(引自《TheElementsofStatisticalLearning》)可以直观地看出来PCA做了什么,对于一些原始为二维的数据,PCA首先找到了variance最大的那一个方向:
PCA作为一种经典的降维方法,被广泛地应用于机器学习、计算机视觉以及信息检索等各个领域,其地位类似于聚类中的K-means,在现在关于降维等算法的研究中也经常被作为baseline出现。
然而,PCA也有一些比较明显的缺点:
一个就是PCA降维是线性变换,虽然线性变换计算方便,并且可以很容易地推广到新的数据上,然而有些时候线性变换也许并不合适,为此有许多扩展被提出来,其中一个就是KernelPCA,用KernelTrick来将PCA推广到非线性的情况。
另外,PCA实际上可以看作是一个具有Gaussian先验和条件概率分布的latentvariable模型,它假定数据的mean和variance是重要的特征,并依靠covariance最大化来作为优化目标,而事实上这有时候对于解决问题帮助并不大。
一个典型的问题就是做聚类或分类,回想我们之前谈过的SpectralClustering,就是使用Laplacianeigenmap降维之后再做K-means聚类,如果问题定下来了要对数据进行区分的话,“目的”就变得明朗了一些,也就是为了能够区分不同类别的数据,再考虑直观的情况,我们希望如果通过降维把高维数据变换到一个二维平面上的话,可以很容易“看”出来不同类别的数据被映射到了不同的地方。
虽然PCA极力降低reconstructionerror,试图得到可以代表原始数据的components,但是却无法保证这些components是有助于区分不同类别的。
如果我们有训练数据的类别标签,则可以用FisherLinearDiscriminantAnalysis来处理这个问题。
同PCA一样,FisherLinearDiscriminantAnalysis也是一个线性映射模型,只不过它的目标函数并不是Variance最大化,而是有针对性地使投影之后属于同一个类别的数据之间的variance最小化,并且同时属于不同类别的数据之间的variance最大化。
具体的形式和推导可以参见《PatternClassification》这本书的第三章ComponentAnalysisandDiscriminants。
当然,很多时候(比如做聚类)我们并不知道原始数据是属于哪个类别的,此时LinearDiscriminantAnalysis就没有办法了。
不过,如果我们假设原始的数据形式就是可区分的的话,则可以通过保持这种可区分度的方式来做降维,MDS是PCA之外的另一种经典的降维方法,它降维的限制就是要保持数据之间的相对距离。
实际上MDS甚至不要求原始数据是处在一个何种空间中的,只要给出他们之间的相对“距离”,它就可以将其映射到一个低维欧氏空间中,通常是三维或者二维,用于做visualization。
不过我在这里并不打算细讲MDS,而是想说一下在SpectralClustering中用到的降维方法LaplacianEigenmap。
同MDS类似,LE也只需要有原始数据的相似度矩阵,不过这里通常要求这个相似度矩阵
具有局部性质,亦即只考虑局部领域内的相似性,如果点
和
距离太远的话,
应该为零。
有两种很直接的办法可以让普通的相似度矩阵具有这种局部性质:
1.通过设置一个阈值,相似度在阈值以下的都直接置为零,这相当于在一个
-领域内考虑局部性。
2.对每个点选取k个最接近的点作为邻居,与其他的点的相似性则置为零。
这里需要注意的是LE要求相似度矩阵具有对称性,因此,我们通常会在
属于
的k个最接近的邻居且/或反之的时候,就保留
的值,否则置为零。
构造好
之后再来考虑降维,从最简单的情况开始,即降到一维
,通过最小化如下目标函数来实现:
从直观上来说,这样的目标函数的意义在于:
如果原来
和
比较接近,那么
会相对比较大,这样如果映射过后
和
相差比较大的话,就会被权重
放大,因此最小化目标函数就保证了原来相近的点在映射过后也不会彼此相差太远。
令
为将
的每一行加起来所得到的对角阵,而
,被称作是拉普拉斯矩阵,通过求解如下的特征值问题
易知最小的那个特征值肯定是0,除此之外的最小的特征值所对应的特征向量就是映射后的结果。
特征向量是一个N维列向量,将其旋转一下,正好是N个原始数据降到一维之后的结果。
类似地推广到M维的情况,只需要取除去0之外的最小的M个特征值所对应的特征向量,转置之后按行排列起来,就是降维后的结果。
用Matlab代码写出来如下所示(使用了knn来构造相似度矩阵,并且没有用heatkernel):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%LaplacianEigenmapALGORITHM(usingKnearestneighbors)
%
%[Y]=le(X,K,dmax)
%
%X=dataasDxNmatrix(D=dimensionality,N=#points)
%K=numberofneighbors
%dmax=maxembeddingdimensionality
%Y=embeddingasdmaxxNmatrix
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function[Y]=leigs(X,K,d)
[D,N]=size(X);
fprintf(1,'LErunningon%dpointsin%ddimensions\n',N,D);
%STEP1:
COMPUTEPAIRWISEDISTANCES&FINDNEIGHBORS
fprintf(1,'-->Finding%dnearestneighbours.\n',K);
X2=sum(X.^2,1);
distance=repmat(X2,N,1)+repmat(X2',1,N)-2*X'*X;
[sorted,index]=sort(distance);
neighborhood=index(2:
(1+K),:
);
%STEP2:
ConstructsimilaritymatrixW
fprintf(1,'-->Constructingsimilaritymatrix.\n');
W=zeros(N,N);
forii=1:
N
W(ii,neighborhood(:
ii))=1;
W(neighborhood(:
ii),ii)=1;
end
%STEP3:
COMPUTEEMBEDDINGFROMEIGENVECTSOFL
fprintf(1,'-->Computingembedding.\n');
D=diag(sum(W));
L=D-W;
%CALCULATIONOFEMBEDDING
options.disp=0;options.isreal=1;options.issym=1;
[Y,eigenvals]=eigs(L,d+1,0,options);
Y=Y(:
2:
d+1)'*sqrt(N);%bottomevectis[1,1,1,1...]witheval0
fprintf(1,'Done.\n');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
事实上,LaplacianEigenmap假设数据分布在一个嵌套在高维空间中的低维流形上,LaplacianMatrix
则是流形的LaplaceBeltramioperator的一个离散近似。
关于流形以及LaplacianEigenmap这个模型的理论知识就不在这里做更多地展开了,下面看一个比较直观的例子SwissRoll。
SwissRoll是一个像面包圈一样的结构,可以看作一个嵌套在三维空间中的二维流形,如下图所示,左边是SwissRoll,右边是从SwissRoll中随机选出来的一些点,为了标明点在流形上的位置,给它们都标上了颜色。
而下图是LaplacianEigenmap和PCA分别对SwissRoll降维的结果,可以看到LE成功地把这个流形展开把在流形上属于不同位置的点映射到了不同的地方,而PCA的结果则很糟糕,几种颜色都混杂在了一起。
另外,还有一种叫做LocallyLinearEmbedding的降维方法,它同LE一样采用了流形假设,并假定平滑流形在局部具有线性性质,一个点可以通过其局部邻域内的点重构出来。
首先它会将下式最小化
以求解出最优的局部线性重构矩阵
,对于距离较远的点
和
,
应当等于零。
这之后再把
当作已知量对下式进行最小化:
这里
成了变量,亦即降维后的向量,对这个式子求最小化的意义很明显了,就是要求如果原来的数据
可以以
矩阵里对应的系数根据其邻域内的点重构出来的话,那么降维过后的数据也应该保持这个性质。
经过一些变换之后得到的求解方法和LE类似,也是要求解一个特征值问题,实际上,从理论上也可以得出二者之间的联系(LE对应于
而LLE对应于
),如果感兴趣的话,可以参考LaplacianEigenmapsforDimensionalityReductionandDataRepresentation这篇论文里的对比。
下面是两种方法在SwissRoll数据上的结果,也是非常相似的:
有一点需要注意的是,LE和LLE都是非线性的方法,PCA得到的结果是一个投影矩阵,这个结果可以保存下来,在之后对任意向量进行投影,而LE和LLE都是直接得出了数据降维之后的结果,但是对于新的数据,却没有得到一个“降维函数”,没有一个合适的方法得到新的数据的降维结果。
所以,在人们努力寻求非线性形式扩展PCA的时候,另一些人则提出了LE和LLE的线性形式,分别叫做LocalityPreservingProjection和NeighborhoodPreservingEmbedding。
在LPP中,降维函数跟PCA中一样被定为是一个线性变换,用一个降维矩阵
来表示,于是LE的目标函数变为
经过类似的推导,最终要求解的特征值问题如下:
得到的按照特征值从小到大排序的特征向量就组成映射矩阵
,和LE不同的是这里不需要去掉第一个特征向量。
另一点是在LE中的特征值是一个稀疏的特征值问题,在只需要求解最小的几个特征值的时候可以比较高效地求解,而这里的矩阵在乘以
之后通常就不再稀疏了,计算量会变得比较大,这个问题可以使用SpectralRegression的方法来解决,参见SpectralRegression:
AUnifiedApproachforSparseSubspaceLearning这篇paper。
如果采用KernelTrick再把LPP非线性化的话,又会回到LE。
而LLE的线性版本NPE也是采用了类似的办法来得到的,就不在这里多讲了。
另外,虽然LE是unsupervised的,但是如果训练数据确实有标签可用,也是可以加以利用的——在构造相似度矩阵的时候,属于同一类别的相似度要大一些,而不同类别的相似度则会小一些。
当然,除去聚类或分类之外,降维本身也是一种比较通用的数据分析的方法,不过有许多人批评降维,说得到的结果没有意义,不用说非线性,就是最简单的线性降维,除去一些非藏极端的特殊情况的话,通常将原来的分量线性组合一下都不会得到什么有现成的物理意义的量了。
然而话也说回来,现在的机器学习几乎都是更prefer“黑盒子”式的方法吧,比如决策树,各个分支对应与变量的话,它的决策过程其实人是可以“看到”或者说“理解”的,但是SVM就不那么“直观“了,如果再加上降维处理,就更加“不透明”了。
不过我觉得这没什么不好的,如果只是靠可以清晰描诉出来的rule的话,似乎感觉神秘感不够,没法发展出“智能”来啊^_^bb最后,所谓有没有物理意义,其实物理量不过也都是人为了描述问题方便而定义出来的吧。
Tags:
Clustering,UnsupervisedLearning
20commentsto漫谈Clustering(番外篇):
DimensionalityReduction
∙
zhouyuan
June21st,2009at9:
47pm·Reply
kid,你不做professor真的可惜了。
。
。
∙
pluskid
June22nd,2009at12:
01am·Reply
@zhouyuan
-,-//
∙
paul
June23rd,2009at10:
44am·Reply
深入浅出,问题描述的很清楚
很适合当老师
∙
cerror
June24th,2009at3:
14pm·Reply
其实,现在很多降维算法的最终目的已经不是减少维度,从而减少计算量了。
而是为了解决Semanticgap的问题。
就是说,最终降到几维,可能是不确定的。
比如原始数据有300维,我算出来400维的空间中,数据分离的最好,那就到400维好了。
所以降维学出那个manifold,基本上任务就结束了……
∙
heshizhu
August3rd,2009at8:
10pm·Reply
刚学习降维方面的内容!
我现在就认为不同的降维方法就两个地方不同,一是定义对象之间的形似度和相异度的方法不同,另一个就是目标函数不一样。
还有关于是否是线性的理解还不是很充分,我总认为线性的就是一个像加权一样,比如一个对象有n个特征,要把它降维为m维,则就是让降维后的每一个特征都是前面n个特征的加权值,不知道我理解对不?
能否对我讲下这个线性和非线性本质的区别是什么,我的理解不是很合理!
∙
pluskid
August4th,2009at11:
40am·Reply
@heshizhu
差不多吧,线性就是你能得到一个W,去乘以原来的x就能得到低维的形式,就是加权和了,而非线性的话,就没有一个固定形式或者可以用这样的线性解析式写出来的降维方法了。
∙
Chrysalis
December2nd,2009at11:
54am·Reply
“同PCA一样,FisherLinearDiscriminantAnalysis也是一个线性映射模型,只不过它的目标函数并不是Variance最大化,而是有针对性地使投影之后属于同一个类别的数据之间的variance最小化,并且同时属于不同类别的数据之间的variance最大化。
”
土问:
不同类别之间的“variance”是怎么定义来着?
?
我觉得应该是所有类别的样本总体有一个Variance,(设V_Totle)。
各个类别的样本有各自的Variance,(设V_individual)。
而类别之间的“variance”是指V_Totle–sigma(V_individual)。
这样理解起来比较顺。
∙
Chrysalis
December2nd,2009at12:
01pm·Reply
options.disp=0;opt