多维定标法(Multidimensional scaling, MDS) - ricket-sjtu/bi028 GitHub Wiki

1. 什么是MDS?

MDS是将多个对象之间的相似性/差异(similarity/dissimilarity)投影到低维空间(low-dimensional space)中的点,然后进行定位、分类,同时保持对象间原始关系的一种分析方法。

例如,在笛卡尔空间(cartesian space)中,可以定义任意两个点之间的广义距离,例如

  • 欧氏距离(Euclidean distance):也就是平方根距离,$d_{eu} = \sqrt{\mathbf{(x-y)^T(x-y)}}$
  • 标准化欧氏距离(Standardized Euclidean distance):对数据进行标准化处理后再计算欧氏距离。所谓标准化处理,就是减去均值,再除以标准差。
  • 曼哈顿距离(Manhattan distance):也称为city-block distance
  • 切比雪夫距离(Chebyshev distance)
  • 闵科夫斯基距离(Minkovski distance):是欧氏空间距离计算的一般距离计算公式($d = \sqrt[n]{\sum_i | x_i - y_i |^n}$)
  • 马氏距离(Mahalanobis distance):stats::mahalanobis()
  • 汉明距离(Hamming distance)
  • 夹角余弦距离(Cosine distance)
  • 杰卡德距离(Jaccard distance)
  • 相关性距离(Correlation distance)
  • 互信息(Mutual information)
  • K-L散度(K-L divergence):是针对两个不同的概率分布的距离度量,个人觉得中文这里的“散度”翻译的真是不错

等,然后我们可以用MDS将这些点在低维空间如二维、三维空间中展现(representation)出来。从某种意义来说,PCA也算是一种特殊的MDS。

1.1 什么是度量型的(metric)MDS?

也成为经典(classical)MDS,这是根据各点的欧氏距离,在低维空间中确定各点座标,同时尽量保持距离不变的一种手段。

R程序

  • MASS::cmdscale()
  • vegan::monoMDS()
library(ggplot2)
library(HSAUR2)
data(watervoles)
voles.mds <- cmdscale(watervoles, k=13, eig=T)
sum(voles.mds$eig[1:2]^2)/sum(voles.mds$eig^2)
points <- data.frame(voles.mds$points[,1:2])
ggplot(points, aes(x=points[,1], y=points[,2], label=colnames(watervoles))) +
   geom_point(shape=16, size=3, colour="red") +
   geom_text(hjust=-.1, vjust=.5, alpha=.5)

1.2 什么是非度量型(nonmetric)MDS?

所谓非度量(non-metric),也就是指不考虑实际的距离数值,而是考虑距离的排序,所以非度量的方法,也称为排序方法(ordination method)

R程序

  • MASS::isoMDS()
  • MASS::sammon()
  • vegan::metaMDS()
library(MASS)
library(HSAUR2)
data(voting)
voting.mds = isoMDS(voting)
x = voting.mds$points[,1]
y = voting.mds$points[,2]
ggplot(data.frame(x,y), aes(x, y, label = colnames(voting)))
   geom_point(shape=16,size=3,colour='red') +
   geom_text(hjust=-0.1,vjust=0.5,alpha=0.5)
voting.sh <- Shepard(as.dist(voting), voting.mds$points)
plot(voting.sh, pch=16, cex=.6)
lines(voting.sh$x, voting.sh$yf, type='s', col='red')