トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

MDS

多次元尺度法 (MDS)

  • 類似度(距離)行列から、類似しているものを近く、類似していないものを遠くプロットするための座標をみつける。

例1 Rにあるもの 

library(MASS)
data(eurodist)   #ヨーロッパの都市間距離
eurodist
(res<-cmdscale(eurodist,k=2,eig=T))   #2次元を指定して実行  固有値なども計算

#出力  各都市の座標
#                       [,1]        [,2]
#Athens           2290.274680  1798.80293
#Barcelona        -825.382790   546.81148
#Brussels           59.183341  -367.08135
#Calais            -82.845973  -429.91466
#Cherbourg        -352.499435  -290.90843
#Cologne           293.689633  -405.31194
#Copenhagen        681.931545 -1108.64478
#Geneva             -9.423364   240.40600
#Gibraltar       -2048.449113   642.45854
#Hamburg           561.108970  -773.36929
#Hook of Holland   164.921799  -549.36704
#Lisbon          -1935.040811    49.12514
#Lyons            -226.423236   187.08779
#Madrid          -1423.353697   305.87513
#Marseilles       -299.498710   388.80726
#Milan             260.878046   416.67381
#Munich            587.675679    81.18224
#Paris            -156.836257  -211.13911
#Rome              709.413282  1109.36665
#Stockholm         839.445911 -1836.79055
#Vienna            911.230500   205.93020

#$eig

#[1]  1.953838e+07  1.185656e+07  1.528844e+06  1.118742e+06  7.893472e+05  5.816552e+05  2.623192e+05  1.925976e+05  1.450845e+05  1.079673e+05  5.139484e+04

#[12] -3.259629e-09 -9.496124e+03 -5.305820e+04 -1.322166e+05 -2.573360e+05 -3.326719e+05 -5.162523e+05 -9.191491e+05 -1.006504e+06 -2.251844e+06

#$x#NULL

#$ac#[1] 0

#$GOF  2次元で86.7%を説明#[1] 0.7537543 0.8679134

#プロットする
plot(res$points)
text(res, rownames(res$points),pos=4,col="red")
#プロットする  南北=上下入れ替え
plot(res$points[,1],-res$points[,2])
text(res$points[,1],-res$points[,2], rownames(res),pos=4,col="red")

例2 自分で行列を与える


  dat<-matrix(c(  NA, 40, 60, 5,5,  40, NA, 50, 4,6,  60, 50, NA, 3,3,  5, 4, 3, NA,20,  5, 6, 3, 20,NA),byrow=T,nrow=5,ncol=5) #類似度行列

 rownames(dat)<-colnames(dat)<-c("A","B","C","D","E")

 dat

#これは類似度行列なので距離に直す=最大値から引く=
 m<-max(dat,na.rm=T)
 dat2<-as.dist(m-dat)
 dat2
 #多次元尺度法  2次元を指定
(res<-cmdscale(dat2,k=2, eig=T))

  #出力 # [,1] [,2] 座標

 #A -19.66022  -1.455319
 #B -19.30554   2.257076
 #C -22.74339  -1.073071
 #D  31.30054 -19.837010
 #E  30.40860  20.108323

#$eig
#[1]  3.180896e+03  8.062155e+02  1.975403e+02  1.705303e-13 -4.465212e+01

#$x
#NULL

#$ac
#[1] 0

#$GOF
#[1] 0.9427347 0.9527941

plot(res$points)		#プロット
	text(res$points,rownames(res),pos=2)