2022年12月11日日曜日
古典的多次元尺度構成法のことなど
古典的多次元尺度構成法について教えてくれるサイトがたくさんある。だいたいこんなふうに紹介されている。
1.中心化する。
内積をつかって一発でこれをやるナイスな方向とともに説明されてることがおおい。
2.中心化した距離行列(の二乗)をもとめる。
これまた内積をつかう方法を教えてくれたりしている。
3.そいつを固有値分解する。
4.固有ベクトルと(固有値のルート)で内積したのがpositionだよ
これだとつまり、中心化したものをPCAかけたのとまったく同じものが得られるわけだ。皆さんこうおっしゃるのだ。ところがですよ、cmdscaleで計算した結果はPCAの結果とは違うのよ。eurodistとかでやってみると、PCAよりもcmdscaleのほうがずっと成績がいいのよ。成績ってまあ、positionからdistをだして、もとデータとどのくらい違うかで可視化できるわけで。
じゃあcmdscaleってどう計算してるんだろう? 論文はでてるけど長いな読むの面倒だな。したら、わりとRで書いてくれてたから、解析してみた。だいたいこんな計算。
d <- as.matrix(eurodist)
x <- as.matrix(d^2); storage.mode(x) <- "double"
T<- (diag(rep(1,times=n))-rep(1,times=n)%*%t(rep(1,times=n))/n)
x <- T %*% x %*%t(T) # xを中心化している
rn <- rownames(x); n <- nrow(x)
e <- eigen(-x/2, symmetric = TRUE) #固有値分解
ev <- e$values[seq_len(k)] ; evec <- e$vectors[, seq_len(k), drop = FALSE]
points <- evec * rep(sqrt(ev), each = n); dimnames(points) <- list(rn, NULL)
つまり、中心化とか最初は考えてない。距離行列をひたすら二乗して、それを中心化してから、その(の-1/2)を固有値分解してる。-x/2にしてる意味は不明。これはPCAじゃない。 x<-d%*%t(d)ならPCAだけど。ヤングハウスホルダー変換はxの中心化のときにつかってる。
やってることが違うので、説明してくれてるサイトのその説明は、みんな間違ってますぜってことだあなあ。WikiもPCAと同じっていってるけどさ。放送大学の先生のもたぶん間違いですよ、さらっとしか説明しなかったけど? いや先生のおかげで多次元尺度構成法を知ったんだけど。献血中にヒマだったので見た授業、なかなかに楽しかったのであとで調べてみたのですが。
-d^2/2を標的にした意味、というあたりに多次元尺度構成法の肝腎がありそうだ。これは論文よまなきゃダメっぽいな。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿