MDS(Multidimensional Scaling)

来源:互联网 发布:中兴通抵扣软件 编辑:程序博客网 时间:2024/06/08 00:35

MDS的主要思想

MDS的目的是降维。怎么降才能使损失的信息更少呢?我们想到,如果降到低维后,所有点之间的距离还和高维时点间距离相同,那么就可以大致认为我们保留下来了原来的信息。

算法具体内容

通过输入的高维点集(I个点),可以得到距离矩阵:

这里写图片描述

降维后的点集:{xi, i=1, 2, …, I}

我们要想办法,使得降维后的点生成的距离矩阵和高维点距离矩阵尽量相同。即,

这里写图片描述

算法推导

构造降维后点集的矩阵,

X=xT1xT2xTI

定义矩阵T,
T=XXT

其中,
tij=xixj

对于距离矩阵,
δ2ij=(xixj)2=x2i+x2j2xixj

tij=12(δ2ijx2ix2j)

jδ2ij=nx2i+jx2j2xijxj=nx2i+jx2j

iδ2ij=nx2j+ix2i2xjixi=nx2j+ix2i

ijδ2ij=nix2i+njx2j

如果我们提前对X进行去均值化的话,就有,
jxj=ixi=0

联立以上各式, 可以求得矩阵T。
注意到,

T=XXT

对T进行特征分解,
T=UΛUT

即可得到X,也就是降维后的点集。
X=UΛ

python代码实现

自己写了一个小函数实现mds。觉得麻烦的朋友可以直接去网上找一找相关的python库,好像是有封装好的函数的。

"""Author: totodumProgram: Multidimensional_Scaling.pyDescription: Multidimensional Scaling algorithm"""from numpy import *from numpy.linalg import *'''MDS take the distance matrix d and reduce the dimension to 'dimension'    return the result vector of dimension 'dimension''''def mds(d, dimension):    (n, n) = shape(d)    t = zeros((n, n))    d_square = d**2    d_sum = sum(d_square)    d_sum_row = sum(d_square, axis=0)    d_sum_col = sum(d_square, axis=1)    for i in range(n):        for j in range(n):            t[i, j] = -(d_square[i, j] - d_sum_row[i]/n -                         d_sum_col[j]/n + d_sum/(n*n))/2    [U, S, V] = svd(t)    X_original = U * sqrt(S)    X = X_original[:, 0:dimension]    return X
0 0