No.13302 クラスター分析  【ポラーノ広場】 2010/08/23(Mon) 11:18

Rユーザーの皆様ぜひご教示いただきたいと思います。
三次元の散布図を以下のように作成し,各点の座標から距離1以下にある他の点を線で結んでいます。(距離の近いものをクラスターとする)このとき,点を線で結ばずに,点の色で表現したいと思います。線が邪魔になることがありますので。
library(rgl)
x <- runif(100, 0, 10)
y <- runif(100, 0, 10)
z <- runif(100, 0, 10)
dat <- cbind(x, y, z)
df <- data.frame(dat)
df
mdata <- as.matrix(df)
plot3d(mdata, type="s", col=4, radius=0.05)
d <- as.matrix(dist(mdata))
# 距離 1 以下の点を線で結ぶ
con <- which(d <= 1, arr.ind=TRUE)
apply(con, 1, function(xy) lines3d(mdata[xy,], lwd=2, col=2))
最後の式を使わずに,距離の近い点同士を色分けする方法をご教示いただけないでしょうか?よろしくお願いいたします。

No.13303 Re: クラスター分析  【青木繁伸】 2010/08/23(Mon) 12:56

別人なら失礼ですが,メジロウさんでしょうか?メジロウさんならば RjpWiki の方でちゃんとけりをつけておいた方がよいと思います。

さ て,apply を使わずに点同士を色分けするということですけど距離が 1 以下になる端点(2個)を別の色(例えば赤)にしたいということですか?でも,dist(A, B) < 1 で,その近くに dist(C, D) < 1 があるけど dist(A, C) > 1 && dist(A, D) > 1 && dist(B, C) > 1 && dist(B, D) > 1 みたいなときにも,4 つの点が全部赤になってしまい,2 つのクラスターが 1 つのクラスターと区別がつかないてなことになりますね。クラスターごとに色を変えますか?でも,全部のクラスターの色を変えると,色の区別がしにくくなる という欠点がありますし,近くにあるクラスターにはかなり異なる色を与える等ということをするためにはかなり面倒なプログラムが必要だと思います。
plot3d は インタラクティブに座標を回転できるので,線分で結ぶというのがよい解決法ではないかと思いますけど?例に挙げられているプログラムでは線分の太さが 2 になっているので,デフォルトの 1 にすれば,点と重なることも少なくなると思いますが。

plot3d が col 引数を持つのですから,con に基づいて,色を決めればよいのだと思いますけどどうでしょうか?なお,提示された プログラムで,cbind で作られた dat は matrix なので,それをデータフレームで df にして,さらにまた as.matrix で matrix にするのは無駄なので,例示のプログラムではそのあたりを変更しました。先頭の set.seed はプログラムを検証するために,いつも同じ行列ができるようにということで追加しておきます。
set.seed(666)
library(rgl)
x <- runif(100, 0, 10)
y <- runif(100, 0, 10)
z <- runif(100, 0, 10)
dat <- cbind(x, y, z)
d <- as.matrix(dist(dat))
# 距離 1 以下の点を線で結ぶ
con <- which(d <= 1, arr.ind=TRUE)
col <- rep("black", nrow(dat))
col[as.integer(con[con[, 1]>con[, 2],])] <- "red"
plot3d(dat, type="s", radius=0.1, col=col)


No.13305 Re: クラスター分析  【ポラーノ広場】 2010/08/23(Mon) 16:06

青木先生
ご教示ありがとうございました。(メジロウさんではございませんので悪しからず)

何点かご指摘いただき恐縮です。
dist(A, C) > 1 && dist(A, D) > 1 && dist(B, C) > 1 && dist(B, D) > 1 みたいなときにも,4 つの点が全部赤になっても構いません。クラスター間の区別がつかなくても,非クラスター(独立点)とクラスター(色分け)の区別をまずはっきり区別した い,あるいは小クラスターと大クラスターを区別したいと思い,この方法を考えました。結線があると若干見づらくなるので,plot3dで radius=0.15〜0.2くらいにして色分けすると(2色でも)よくわかります。

また,拙いプログラムをわざわざ修正していただきありがとうございました。
最後になりましたが,青木先生に心から感謝いたします。

● 「統計学関連なんでもあり」の過去ログ--- 043 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る