您的位置:首页 > 其它

等度量映射ISOMAP

2021-11-20 15:56 666 查看

简介

  流形学习是一类借鉴了拓扑流形概念的降维方法。流形是在局部与欧式空间同胚的空间,换言之,它在局部具有欧式空间的性质,能用欧式距离来进行距离计算。若低维流形嵌入到高维空间中,则数据样本在高维空间的分布虽然看上去非常复杂,但在局部上仍具有欧式空间的性质,基于流形学习的降维正是这种“邻域保持”的思想。如此,可以在局部建立降维映射关系,然后再设法将局部映射推广到全局。当维数被降至二维或三维时,能对数据进行可视化展示。因此流形学习也可被用于可视化 。

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 d
def calculate_distance_matrix(x,y):
d=metrics.pairwise_distances(x,y)
return d
def 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()
View Code  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: