ラベル付きの数値ベクトルデータをプロットする
d <- iris[,1:4] pc <- prcomp(d, scale.=T) plot( pc$x[,"PC1"], pc$x[,"PC2"], pch=21, bg=iris[,5])
重みwが変数:相関係数が0のときw、相関係数が1のとき0
library(MASS) d <- iris[,1:4] w <- 1 dd <- 1 - cor(t(d)) c <- isoMDS( w * dd + (1 - diag( dim(d)[1] )) * 0.001, k = 2 ) plot.new() plot(c$points, pch=21, bg=iris[,5])
library(MASS) d <- iris[,1:4] w <- 1 dd <- 1 - cor(t(d)) c <- sammon( w * dd + (1 - diag( dim(d)[1] )) * 0.001, k = 2 ) plot.new() plot(c$points, pch=21, bg=iris[,5])
次のプログラムでシルエット距離を求める.これが1に近いほど、よいクラスタ
library(cluster) avg_width <- summary( silhouette( as.numeric( iris[,5] ), dist(c$points) ) )$avg.width
先ほどのMDSで w を求める問題が残っていた。
1/10.0, 2/10.0, ..., 100/10.0 とwを変えてシルエット距離を求める
実行が終わるまでしばらく待つ.
library(MASS) library(cluster) len <- 100 avg_width <- rep(0, len) w <- rep(0, len) d <- iris[,1:4] for ( i in 1:len ) { w[i] <- i / 10.0 dd <- 1 - cor(t(d)) c <- isoMDS( w[i] * dd + (1 - diag( dim(d)[1] )) * 0.001, k = 2 ) avg_width[i] <- summary( silhouette( as.numeric( iris[,5] ), dist(c$points) ) )$avg.width } for ( i in 1:len ) { print( sprintf("%f %f", w[i], avg_width[i]) ) }
今度は sammon
べき乗 0.1 乗から10乗まで
library(MASS) library(cluster) len <- 100 avg_width <- rep(0, len) w <- rep(0, len) d <- iris[,1:4] for ( i in 1:len ) { w[i] <- i / 10.0 dd <- 1 - cor(t(d)) c <- sammon( w[i] * dd + (1 - diag( dim(d)[1] )) * 0.001, k = 2 ) avg_width[i] <- summary( silhouette( as.numeric( iris[,5] ), dist(c$points) ) )$avg.width } for ( i in 1:len ) { print( sprintf("%f %f", w[i], avg_width[i]) ) }