MDS的主要思想
MDS的目的是降维。怎么降才能使损失的信息更少呢?我们想到,如果降到低维后,所有点之间的距离还和高维时点间距离相同,那么就可以大致认为我们保留下来了原来的信息。
算法具体内容
通过输入的高维点集(I个点),可以得到距离矩阵:
降维后的点集:{xi, i=1, 2, …, I}
我们要想办法,使得降维后的点生成的距离矩阵和高维点距离矩阵尽量相同。即,
算法推导
构造降维后点集的矩阵,
X=⎛⎝⎜⎜⎜⎜⎜xT1xT2⋮xTI⎞⎠⎟⎟⎟⎟⎟
定义矩阵T,
T=XXT
其中,
tij=xixj
对于距离矩阵,
δ2ij=(xi−xj)2=x2i+x2j−2xixj
tij=−12(δ2ij−x2i−x2j)
∑jδ2ij=nx2i+∑jx2j−2xi∑jxj=nx2i+∑jx2j
∑iδ2ij=nx2j+∑ix2i−2xj∑ixi=nx2j+∑ix2i
∑ijδ2ij=n∑ix2i+n∑jx2j
如果我们提前对X进行去均值化的话,就有,
∑jxj=∑ixi=0
联立以上各式, 可以求得矩阵T。
注意到,
T=XXT
对T进行特征分解,
T=UΛUT
即可得到X,也就是降维后的点集。
X=UΛ−−√
python代码实现
自己写了一个小函数实现mds。觉得麻烦的朋友可以直接去网上找一找相关的python库,好像是有封装好的函数的。
"""
Author: totodum
Program: Multidimensional_Scaling.py
Description: 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