Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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...
1.532557e-16

特異値分解
• クラスごとに相関行列の固有値と固有ベクトルを求める
> # クラス0のデータ行列を特異値分解
> svd0 <- svd(t(train0))
> # 固有ベクトルが正規直交基底を成していることを確認...
正規直交基底を可視化

第1主成分

第2主成分

第3主成分

第4主成分

⋯
第5主成分

•
•
•

第6主成分

第7主成分

第8主成分

可視化にはProcessing (http://processing.org/) を使用
...
他のクラスも同様に
⋯
⋯
⋯

⋯
他のクラスも同様に
⋯
⋯
⋯

⋯
⋯
各クラスの部分空間の次元を決める
•

𝑖 番目のクラスに属する入力ベクトルをクラス 𝑖 の部分空間に正射影し
たときの長さの期待値がクラス間で同程度になるように、各クラスの
部分空間の次元を決める。

• 具体的な方法としては、各部分空間に共...
こうなった。。。
クラス

次元数

0

2

1

784

2

8

3

8

4

58

5

77

6

9

7

31

8

8

9

27

• クラス 1 は全次元足し合わせても
• データ、バラついて無さ過ぎ…
...
テストデータの識別をしてみる
• 識別規則は、入力ベクトル

𝒙 を各クラスの部分空間に射影し、射影後
のベクトルの長さが一番長いクラスに所属すると判定するというもの。

• 射影後のベクトルの長さは、クラス 𝑖 の射影行列
使用して 𝒙 𝑇 ...
すいません、ここで時間切れです。。。
ご清聴ありがとうございました。
Upcoming SlideShare
Loading in …5
×

TokyoR 第36回LT Rで部分空間法

6,031 views

Published on

2014/2/22(土)TokyoR 第36回LT

Published in: Education
  • Be the first to comment

TokyoR 第36回LT Rで部分空間法

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

×