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()

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值