数据降维-多维尺度缩放(MDS)

多维尺度缩放(MDS)是一种比较经典的降维方法,它利用在低维度空间维持高维度空间的距离矩阵来学习数据在低维度空间的表示。算法如下:

以上算法来自西瓜书的截图。 

python代码如下:

#Multiple Dimensional Scaling,MDS,多维尺度缩放
#数据是按照行来排列的
#尽量让样本数目大于数据的维度
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import eig
from scipy.spatial.distance import pdist,squareform
class MDS():
    def __init__(self,dim):
        self.dim=dim
    def fit(self,X):
        self.X=X
        return self
    def predict(self):
        sample_number=self.X.shape[0]#样本数量
        #距离矩阵
        dist_2_matrix=squareform(pdist(self.X,"euclidean"))**2
        dist_i=np.mean(dist_2_matrix,axis=1).reshape((1,sample_number))
        dist_j=np.mean(dist_2_matrix,axis=0).reshape((sample_number,1))
        dist_ij=np.mean(dist_j)
        b=dist_2_matrix-dist_i-dist_j+dist_ij
        b=b*-0.5
        eigvalue,eigvector=np.linalg.eig(b)
        eig_diag=np.diag(eigvalue)
        Z_latent=eigvector[:,:self.dim].dot(eig_diag[:self.dim,:self.dim])
        return Z_latent
#下面为测试数据每一对都是在某个坐标轴上差了1,所以投射到二维空间距离还是比较近的
x=np.array([[2,2,2],[2,2,3],[9,4,9],[10,4,9],[3,45,23],[3,44,23]])
mds=MDS(2)
mds.fit(x)
b=mds.predict()
print(b)
# plt.scatter(x[:,0],x[:,1],c="green")
plt.scatter(b[:,0],b[:,1],c="red")
plt.show()

为了检验试验效果,我们故意制造了三对分别在三个数据轴差1的数据,映射到二维之后,我们可以看到他们之间的距离得到了维持。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值