isomap mds 实现
Isomap 和 mds 实现
数据集:iris
数据集描述:一共五个字段,前四个字段表示花的四个属性,最后一个字段表示花的类别。共有150组数据,三种类别
Mds方法思路:首先计算任意两朵花的欧式距离结果放入disM2矩阵,接着计算B2,然后对B降维为m*2,得到result2矩阵。
Isomap方法思路:首先计算任意两朵花的欧式距离结果放入disM矩阵,选取k=10,使得前k个最短路径记为其欧式距离,其余记为-1,接着根据最短路径算法,计算任意两点的测地线距离。最后将元素测地线距离矩阵作为mds算法输入,计算降维后的result矩阵。
降维结果:
主要代码如下:
#计算欧式距离
for i inrange(m.shape[0]):
disM[i][i]=0
for j in range(m.shape[0]):
if i!=j:
t=0
for n in range(m.shape[1]):
t=t+(m[i][n]-m[j][n])**2
disM[i][j]=t
disM2[i][j]=t
if len(myNeighbor[i])<k:
#myNeighbor[i].append(j)
orderInsert(disM[i],myNeighbor[i],j)
elif disM[i][myNeighbor[i][k-1]]>t:
test=myNeighbor[i][k-1]
x=myNeighbor[i].pop()
disM[i][x]=-1
orderInsert(disM[i],myNeighbor[i], j)
else:
disM[i][j]=-1
#最短路径算法 计算测地线距离 for i in range(disM.shape[0]): mylist=np.arange(0,disM.shape[0],1) mylist=mylist.tolist() while len(mylist)!=0: index=minIndex(disM[i],mylist) minDis=disM[i][index] mylist.remove(index)#disM[i][index]此时是最小的.将index这个下标从mylist删去已经找到i到index最小距离 if minDis==-1: continue for t,item in enumerate(myNeighbor[index]): alt=minDis+disM[index][item] if disM[i][item]==-1 or alt<disM[i][item] : disM[i][item]=alt
#计算mds和isomap的B DISI DISTJ DIST
for i in range(B.shape[0]): distI[i]=(1/m)*sum(disM[i]**2) distJ[i]=(1/m)*sum(disM[0:m][i]**2) distI2[i] = (1 / m) * sum(disM2[i] ** 2) distJ2[i] = (1 / m) * sum(disM2[0:m][i] ** 2) for i in range(m): for j in range(m): B[i][j]=-0.5*(disM[i][j]**2-distI[i]-distJ[j]+dist) B2[i][j] = -0.5 * (disM2[i][j] ** 2 - distI2[i] - distJ2[j] + dist2)
#特征值分解 r,vec=np.linalg.eig(B) r2,vec2=np.linalg.eig(B2) d2=2 largest=heapq.nlargest(d2,range(len(r)),r.take) largest2=heapq.nlargest(d2,range(len(r)),r2.take) V=vec[0:m,largest] V2=vec2[0:m,largest2] r=r[largest] r2=r2[largest2] R=np.zeros(shape=(d2,d2),dtype=complex) R2=np.zeros(shape=(d2,d2),dtype=complex) for i in range(d2): R[i][i]=r[i] R2[i][i] = r2[i] result=np.dot(V,R) result2=np.dot(V2,R2)
#画图
f,ax=plt.subplots(2,1) ax[0].scatter(x1,y1,color='r',marker='o',s=40,facecolors='none') ax[0].scatter(x2,y2,color='b',marker='o',s=40,facecolors='none') ax[0].scatter(x3,y3,color='g',marker='o',s=40,facecolors='none') ax[0].set_title("isomap") ax[1].scatter(x4,y4,color='r',marker='o',s=40,facecolors='none') ax[1].scatter(x5,y5,color='b',marker='o',s=40,facecolors='none') ax[1].scatter(x6,y6,color='g',marker='o',s=40,facecolors='none') ax[1].set_title("mds") plt.show()