Rを用いた主成分分析,次元削減

概要

R システムを用いて,主成分分析による次元削減を行う. 組み込みデータセット iris(アヤメの計測データ)の数値属性4列を対象に,主成分分析(prcomp)と,非計量多次元尺度構成法の isoMDS,sammon の各手法で2次元に次元削減し,結果を散布図にプロットする.

目次

  1. 第1章 前準備
  2. 第2章 主成分分析による次元削減
  3. 第3章 クラスターの評価

第1章 前準備

Rシステムのインストール

第2章 主成分分析による次元削減

主成分スコアのプロット

ここでは,R に組み込まれている iris データセット(アヤメの計測データ)を用いる.iris の1〜4列目は数値属性(がく片・花弁の長さと幅),5列目はラベル(品種名)である。

ラベル付きの数値ベクトルデータをプロットする

d <- iris[,1:4]
pc <- prcomp(d, scale.=T)
plot( pc$x[,"PC1"], pc$x[,"PC2"], pch=21, bg=iris[,5])

isoMDS サンプル

重み w は,相関係数から作った距離 dd にどれだけ重みを掛けるかを表す変数である。

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])

sammon サンプル

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])

第3章 クラスターの評価

次のプログラムでシルエット距離を求める.これが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 について,同様に 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 <- 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]) )
}