多维定标法(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')