降维-多维尺度法(MDS)

来源:互联网 发布:新发行的人工智能基金 编辑:程序博客网 时间:2024/06/07 10:45

多维尺度法(Multidimensional Scaling,MDS)是一种经典的数据降维方法,是当我们仅能获得样本之间的相似性矩阵时,如何由此来重构它们的欧几里德坐标,即只知道高维空间中的样本之间的距离,基于此重构这些样本在低维空间的相对位置!下面一步一步地介绍MDS的神奇。

这里写图片描述

一、问题定义

假定mn维样本在原始空间的距离矩阵为DRm×m,其中第ij列的元素dij为样本xixj的距离:

D=d11d21dm1d12d22dm2d1md2mdmm=0||x2x1||||xmx1||||x1x2||0||xmx2||||x1xm||||x2xm||0.

问题的求解目标是获得样本在n维空间的表示ZRn×m,且任意两个样本在n维空间中的距离等于原始空间中的距离,即||zizj||=dij。此处n<n,从而达到降维的效果。

二、问题建模

为便于讨论,令降维后的样本Z被中心化,即mi=1zi=0。直接由D确定Z的表达式还有点困难,不过可令B=ZTZ,其中bij=zTizj,先由D推出B,然后再由B便可轻松地获得Z。因为有:

d2ij=||zizj||2=||zi||22zTizj+||zj||2=bii+bjj2bij.

基于上式可得B={bij}为:

bij=12(d2ijbiibjj).

因为d2ij是已知的,接下来的问题便变成利用已知的条件确定biibjj的表示?对d2ij进行一些简单的求和运算,可得:

id2ij=i||zi||22(izTi)zj+m||zj||2=m||zj||2+i||zi||2=tr(B)+mbjj,(ZizTi=0)

jd2ij=m||zi||22zTijzj+j||zj||2=m||zi||2+j||zj||2=tr(B)+mbii,

ijd2ij=i(m||zi||2+j||zj||2)=m(i(||zi||2+j||zj||2))=2mtr(B).

其中tr()表示矩阵的迹,其为矩阵主对角线(从左上方至右下方的对角线)上各个元素的总和。由上述3个求和等式可求得:

tr(B)=i=1m||zi||2=12mijd2ij,(1)

bjj=1m(id2ijtr(B))=1mid2ij12m2ijd2ij,(2)

bii=1m(jd2ijtr(B))=1mjd2ij12m2ijd2ij.(3)

最后可得:

bij=12(d2ijbiibjj)=12(d2ij1mid2ij1mjd2ij+1m2ijd2ij).(4)

三、问题求解

已确定了矩阵B的值,接下来推导Z的结果就易如反掌。先对矩阵B做特征分解:

B=VΛVT,

其中Λ=diag(λ1,λ2,,λn)为特征值构成的对角矩阵,λ1λ2λnV为特征向量矩阵。

为了达到有效的降维效果,假定其中有n个非零特征值,其中n<n,它们构成的对角矩阵为Λ=diag(λ1,λ2,,λn),令V为其对应的特征向量矩阵,则Z可表达为:

Z=Λ12VT.

四、算法描述

输入:距离矩阵DRm×m,其中第ij列的元素dij为样本xixj的距离;低维空间维数n
输出:矩阵ZRn×m,其中每列是一个样本的低维坐标。
过程:
1. 根据式(1)~(3)计算tr(B)bjjbii
2. 根据(4)计算bij,确定矩阵B的表示;
3. 对矩阵B进行特征值分解:求得n个对应的特征值和特征向量;
4. 取Λn个最大特征值所构成的对角矩阵,V为其对应的特征向量矩阵;
5. 求得矩阵Z=Λ12VT,得到样本集的低维表示。

五、算法实战

scikit-learn中的MDS算法是在包manifold中,其主要的参数为n_components,它确定了降维的维数,其余参数的介绍、配置请查阅参考资料1。

# -*- coding: utf-8 -*-from sklearn.manifold import MDSimport numpy as npdata = np.array([[1,1],[1.5,1.6],[2,2],[2.4,2.4],[1.95,1.9],[3,3],[3.3,3.1]])mds2 = MDS(n_components=2)newdata2 = mds2.fit_transform(data)numdata = data.shape[0]D1 = np.zeros([numdata,numdata])D2 = np.zeros([numdata,numdata])for i in range(0,numdata):    for j in range(0,numdata):        D1[i,j] = np.sqrt(np.sum(np.square(data[i,:] - data[j,:])))        D2[i,j] = np.sqrt(np.sum(np.square(newdata2[i,:] - newdata2[j,:])))print "MDS前后样本间距离之差:\n",D1-D2mds1 = MDS(n_components=1)newdata1 = mds1.fit_transform(data)print "原始数据-二维:\n", dataprint "降维后数据-一维:\n", newdata1

这里写图片描述

参考资料

  1. http://scikit-learn.org/dev/modules/generated/sklearn.manifold.MDS.html sklearn.manifold.MDS
  2. https://item.jd.com/11867803.html 《机器学习》 周志华
  3. http://blog.csdn.net/Dark_Scope/article/details/53229427 维度打击,机器学习中的降维算法:ISOMAP & MDS
  4. http://blog.csdn.net/songrotek/article/details/42235097 模式识别之 MDS Multidimensional Scaling 多维尺度法 分析及Matlab实现
阅读全文
1 0
原创粉丝点击