UPDATE: 2022-10-28 20:45:30
ここでは「多次元尺度構成法」をおさらいすることを目的にしています。多次元尺度構成法は、MDS:Multi-Dimensional Scalingなどと呼ばれます。「計量」か「非計量」に分けることができ、「データに潜んでいる空間構造」を抽出し、対象の位置関係を表す地図を作る分析手法です。つまり、個体間の距離関係は保ちつつ、多次元を2次元に落とし込むことができます。多次元尺度構成法では、距離と結びつけることで多くの分析を可能にしています。距離=類似度と考えるわけですね。 距離を計算する方法はいくつかありまして、よく使われる馴染みのある「ユークリッド距離」、市街地距離と呼ばれる「マンハッタン距離」、その他にも「バイナリ距離」「ミンコフスキー距離」など様々な方法があります。「ユークリッド距離」を試しに計算してみると下記のようになります。
df
x1 x2 x3
A 3 8 1
B 2 3 7
C 5 6 2
dist(df, method = "euclidean", diag = TRUE, upper = TRUE)
A B C
A 0.000000 7.874008 3.000000
B 7.874008 0.000000 6.557439
C 3.000000 6.557439 0.000000
書く必要もないかもしれないですが、ユークリッド距離の場合、下記のような計算をしています。
・A-Bの距離
sqrt(|3-2|^2+|8-3|^2+|1-7|^2)=sqrt(62)=7.874
・A-Cの距離 sqrt(|3-5|^2+|8-6|^2+|1-2|^2)=sqrt(9)=3
・B-Cの距離
sqrt(|2-5|^2+|3-6|^2+|7-2|^2)=sqrt(43)=6.557
なので、これがirisとかのように行が増えると下記のような大変な計算になります。結果、省略
round(dist(iris[1:50, 1:4], method = "euclidean", diag = TRUE, upper = TRUE),1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
1 0.0 0.5 0.5 0.6 0.1 0.6 0.5 0.2 0.9 0.5 0.4 0.4 0.6 1.0 0.9 1.1 0.5 0.1 0.7 0.3 0.4 0.3 0.6 0.5 0.6 0.5 0.3 0.1 0.1 0.5 0.5 0.4 0.6 0.8
2 0.5 0.0 0.3 0.3 0.6 1.1 0.5 0.4 0.5 0.2 0.9 0.5 0.1 0.7 1.4 1.6 1.1 0.5 1.2 0.8 0.7 0.8 0.8 0.6 0.6 0.2 0.5 0.6 0.5 0.3 0.2 0.7 1.1 1.3
多次元尺度構成法の基本的な計算方法は、距離を表現しているインプットデータ(距離行列)の中から、潜在的なパターンや構造を発見し、次元縮小を行って幾何的に表現する、という点は多次元尺度法の基本的なところではあります。なので、距離を求めて、座標値を求める。そして、2次元で個体を配置する、という感じです。 そもそも何のために多次元尺度法を使うのかというと、個人的には次元縮約して幾何表現をすることで、変数間の位置関係を捉えることを目的しています。マーケティングや広告では、どの顧客と顧客が似ているのかどうか、なんかを調べるためです。 実際には下記のような流れで多次元尺度法を行います。irisの例でどこのページにも載っている事例かと思いますが。Rの組み込みパッケージstatsに、多次元尺度構成法の関数cmdscale(Classical Metric Multidimensional Scaling)が入っていますので、ここではそのまま使用します。eig=TRUEを指定しておくと座標値が$pointの中に格納されます。
#距離を計算
iris.dist <-dist(iris[,-5])
#多次元尺度法のパッケージcmd
iris.cmd <- cmdscale(iris.dist, eig=TRUE)
par(mfrow = c(1,2))
plot(iris.cmd, type = "n")
iris.lab <- factor(c(rep("S",50),rep("C",50),rep("V",50))) #iris[,-5]の長い記号列を略する
text(iris.cmd,labels = iris.lab, col = unclass(iris.lab))
plot(iris.cmd, type = "n")
iris.lab <- rownames(iris) #iris[,-5]の長い記号列を略する
text(iris.cmd, labels = iris.lab)
ここでは、多次元尺度構成法の計算方法をおさらいします。上記で扱っている古典的な多次元尺度構成法は以下の手順で計算します。 1. 距離の2乗と見なせる非類似度行列を用意する 2. 非類似度行列にヤング・ハウスホルダー変換を施す 3. 変換後の行列をスペクトル分解する(固有値・固有ベクトルを計算) 4. 固有値の大きい順に2or3個選び、対応する固有ベクトルを取り出してプロット なのですが、下記の多次元尺度構成法が紹介された論文で著者のLundは距離行列に14.4を非対角要素に加え、半正定値行列に修正していますこの「14.4」の詳細な理由はいまいち理解出来ませんでした・・・ここでもそれに従います。
今回使用するデータは記事の最後においています。アメリカの空港間距離データです。
library(tidyverse)
library(stats)
D_mat <- as.matrix(read.table(pipe("pbpaste")))
lab <- c("atl","chi","den","hou","la","mi","ny","sf","sea","dc")
colnames(D_mat) <- lab
rownames(D_mat) <- lab
D_mat
# 行列のサイズを制御
n <- dim(D_mat)[1]
# Lund(1974)の修正法
E_mat <- matrix(14.4, nrow = n, ncol = n) - diag(n) * 14.4
# 距離行列の2乗
D_mat_mod <- D_mat + E_mat
A_mat <- -0.5 * D_mat_mod^2
# 中心化行列
H_mat <- diag(n) - (rep(1, n) %*% t(rep(1, n)))/n
H_mat
# ヤング・ハウスホルダー変換
B_mat <- H_mat %*% A_mat %*% H_mat
B_mat
# スペクトル分解
w <- eigen(B_mat)$value
v <- eigen(B_mat)$vector
# 固有値が大きい順に軸をとる
x1 <- order(w, decreasing = TRUE)[1]
x2 <- order(w, decreasing = TRUE)[2]
# 中心化していたので、固有値の標準偏差で戻す
mds <- data_frame(x1 = sqrt(w[x1]) * v[,x1],
x2 = sqrt(w[x2]) * v[,x2],
name = lab)
par(mfrow = c(1,2))
plot(mds$x1, mds$x2, type = "n")
text(mds$x1, mds$x2, labels = mds$name)
title(main = "Myfunc")
dm_cmd <- cmdscale(D_mat_mod, k = 2, eig = TRUE)
plot(dm_cmd$points, type = "n")
text(dm_cmd$points, rownames(dm_cmd$points))
title(main = "packages{cmdscale}")
座標の計算結果も一致していますね。
mds
# A tibble: 10 x 3
x1 x2 name
<dbl> <dbl> <chr>
1 -723. 145. atl
2 -385. -343. chi
3 485. -24.8 den
4 -162. 578. hou
5 1211. 392. la
6 -1138. 587. mi
7 -1078. -523. ny
8 1428. 113. sf
9 1348. -584. sea
10 -985. -339. dc
dm_cmd$points
[,1] [,2]
atl -723.3320 144.75334
chi -385.0213 -343.38470
den 484.8239 -24.80074
hou -162.4644 578.12657
la 1210.5349 391.82922
mi -1137.9306 586.91772
ny -1077.5231 -523.33989
sf 1428.0167 112.56187
sea 1348.0402 -583.58677
dc -985.1442 -339.07661
0 587 1212 701 1936 604 748 2139 2182 543
587 0 920 940 1745 1188 713 1858 1737 597
1212 920 0 879 831 1726 1631 949 1021 1494
701 940 879 0 1374 968 1420 1645 1891 1220
1936 1745 831 1374 0 2339 2451 347 959 2300
604 1188 1726 968 2339 0 1092 2594 2734 923
748 713 1631 1420 2451 1092 0 2571 2408 205
2139 1858 949 1645 347 2594 2571 0 678 2442
2182 1737 1021 1891 959 2734 2408 678 0 2329
543 597 1494 1220 2300 923 205 2442 2329 0