Isomap

来源:互联网 发布:英国可以用淘宝吗 编辑:程序博客网 时间:2024/06/01 10:47

Isomap算法是在MDS算法的基础上衍生出的一种算法,MDS算法是保持降维后的样本间距离不变,Isomap算法引进了邻域图,样本只与其相邻的样本连接,他们之间的距离可直接计算,较远的点可通过最小路径算出距离,在此基础上进行降维保距。

计算流程如下:

  1. 设定邻域点个数,计算邻接距离矩阵,不在邻域之外的距离设为无穷大;
  2. 求每对点之间的最小路径,将邻接矩阵矩阵转为最小路径矩阵;
  3. 输入MDS算法,得出结果,即为Isomap算法的结果。

最小路径这里采用Floyd算法:输入邻接矩阵,邻接矩阵中,除了邻域点之外,其余距离都是无穷大,输出完整的距离矩阵。

def floyd(D,n_neighbors=15):    Max=numpy.max(D)*1000    n1,n2=D.shape    k=n_neighbors    D1=numpy.ones((n1,n1))*Max    D_arg=numpy.argsort(D,axis=1)    for i in range(n1):        D1[i,D_arg[i,0:k+1]]=D[i,D_arg[i,0:k+1]]    for k in xrange(n1):        for i in xrange(n1):            for j in xrange(n1):                if D1[i,k]+D1[k,j]<D1[i,j]:                    D1[i,j]=D1[i,k]+D1[k,j]    return D1

其余是MDS的算法:

def calculate_distance(x,y):    d=numpy.sqrt(numpy.sum((x-y)**2))    return ddef calculate_distance_matrix(x,y):    d=metrics.pairwise_distances(x,y)    return ddef cal_B(D):    (n1,n2)=D.shape    DD=numpy.square(D)    Di=numpy.sum(DD,axis=1)/n1    Dj=numpy.sum(DD,axis=0)/n1    Dij=numpy.sum(DD)/(n1**2)    B=numpy.zeros((n1,n1))    for i in xrange(n1):        for j in xrange(n2):            B[i,j]=(Dij+DD[i,j]-Di[i]-Dj[j])/(-2)    return B    def MDS(data,n=2):    D=calculate_distance_matrix(data,data)    B=cal_B(D)    Be,Bv=numpy.linalg.eigh(B)    Be_sort=numpy.argsort(-Be)    Be=Be[Be_sort]    Bv=Bv[:,Be_sort]    Bez=numpy.diag(Be[0:n])    Bvz=Bv[:,0:n]    Z=numpy.dot(numpy.sqrt(Bez),Bvz.T).T    return Z

合成Isomap算法:

def Isomap(data,n=2,n_neighbors=30):    D=calculate_distance_matrix(data,data)    D_floyd=floyd(D)    B=cal_B(D_floyd)    Be,Bv=numpy.linalg.eigh(B)    Be_sort=numpy.argsort(-Be)    Be=Be[Be_sort]    Bv=Bv[:,Be_sort]    Bez=numpy.diag(Be[0:n])    Bvz=Bv[:,0:n]    Z=numpy.dot(numpy.sqrt(Bez),Bvz.T).T    return Z

生成数据集:

def generate_curve_data():    xx,target=datasets.samples_generator.make_s_curve(400, random_state=9)    return xx,target

调用函数:

if __name__=='__main__':    data,target=generate_curve_data()    Z_Isomap=Isomap(data,n=2)    Z_MDS=MDS(data)    figure=pyplot.figure()    pyplot.suptitle('ISOMAP COMPARE TO MDS')    pyplot.subplot(1,2,1)    pyplot.title('ISOMAP')    pyplot.scatter(Z_Isomap[:,0],Z_Isomap[:,1],c=target,s=60)    pyplot.subplot(1,2,2)    pyplot.title('MDS')    pyplot.scatter(Z_MDS[:,0],Z_MDS[:,1],c=target,s=60)    pyplot.show()

结果显示:

原始数据:


降维结果:





1 0
原创粉丝点击