tokyor 第36回lt rで部分空間法
DESCRIPTION
2014/2/22(土)TokyoR 第36回LTTRANSCRIPT
Rで部分空間法
2014/2/22(土) TokyoR #36 LT
@Prunus1350
部分空間法とは
• クラスごとに部分空間を構成する正規直交基底を学習データから求め、入力データを各クラスの部分空間に射影して識別する手法。
Rでやってみる
やったこととやらなかったこと
• やったこと• パッケージは使わずにRの基本的な関数などを使用して「部分空間法」の手法を追ってみる。
• やらなかったこと• パラメータチューニング
• 忠実度(各クラスの部分空間の基底の数を決定するのに使用)
• リジェクトの閾値
使用するデータ
• データマイニングコンペティションサイトKaggleのDigit Recognizer
• 28 × 28のマス目に 0~255の諧調で書かれた手書き文字を「0」から「9」のクラスに識別する。
トレーニングデータをクラス別に分割
> # トレーニングデータ読込> train <- read.csv("train.csv")
> # トレーニングデータをクラス別に分割> for (i in 0:9){+ assign(paste("train", i, sep=""), subset(train, train$label==i)[-1])+ }
• クラスごとに相関行列の固有値と固有ベクトルを求める
特異値分解
> # クラス0のデータ行列を特異値分解> svd0 <- svd(t(train0))
> # 固有ベクトルが正規直交基底を成していることを確認> svd0$u[,1] %*% svd0$u[,1]
[,1][1,] 1> svd0$u[,1] %*% svd0$u[,2]
[,1][1,] 1.532557e-16
> # 固有ベクトルが行ベクトルになるように転置してCSV出力> write.csv(t(svd0$u), file = "svd0.csv", row.names=F)
1.532557e-16
• 可視化にはProcessing (http://processing.org/) を使用
• 正規化されたままの状態で可視化するとほぼ白い画像になってしまうので、適当な定数を掛けている
• 黒色が正の方向、赤色が負の方向を表し、色の濃さが値の大きさを表す
正規直交基底を可視化
第5主成分
第2主成分 第3主成分 第4主成分第1主成分
第6主成分 第7主成分 第8主成分
⋯
他のクラスも同様に
⋯
⋯
⋯
⋯
他のクラスも同様に
⋯
⋯
⋯
⋯
⋯
• 𝑖番目のクラスに属する入力ベクトルをクラス 𝑖の部分空間に正射影し
たときの長さの期待値がクラス間で同程度になるように、各クラスの部分空間の次元を決める。
• 具体的な方法としては、各部分空間に共通なパラメータ 𝜅を導入し、大きい方から並べた固有値の累積値が 𝜅を超えたときの次元数をその部分空間の次元とする。
各クラスの部分空間の次元を決める
• クラス 0の固有値を大きい順にプロットしたもの
• データのバラつきのほとんどは低次元空間に収まっていることが分かる
こうなった。。。
クラス 次元数
0 2
1 784
2 8
3 8
4 58
5 77
6 9
7 31
8 8
9 27
• クラス 1は全次元足し合わせても 𝜅に達せず
• データ、バラついて無さ過ぎ…
• 識別規則は、入力ベクトル 𝒙を各クラスの部分空間に射影し、射影後のベクトルの長さが一番長いクラスに所属すると判定するというもの。
• 射影後のベクトルの長さは、クラス 𝑖の射影行列𝑷𝑖 = 𝑗=1𝑑𝑖 𝒖𝑖𝑗𝒖𝑖𝑗
𝑇を
使用して 𝒙𝑇𝑷𝑖𝒙となる。
• 𝑑𝑖:クラス 𝑖の部分空間の次元
• 𝒖𝑖𝑗:クラス 𝑖の部分空間の𝑗番目の固有ベクトル
• 識別クラス= argmax𝑖 𝒙𝑇𝑷𝑖𝒙 𝑖 = 0,⋯ , 9
テストデータの識別をしてみる
すいません、ここで時間切れです。。。
ご清聴ありがとうございました。