MDS(Multidimensional Scaling)

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: 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
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值