rd-7. 主成分分析,ロバスト主成分分析

243 Views

February 25, 22

スライド概要

データサイエンス演習
(R システムを使用)
https://www.kkaneko.jp/cc/rd/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

rd-7. 主成分分析,ロバス ト主成分分析 データサイエンス演習 (R システムを使用) https://www.kkaneko.jp/cc/rd/index.html 金子邦彦 1

2.

アウトライン 7-1. 主成分分析と次元削減 7-2. パッケージの追加インストール 7-3. 主成分分析の実行 7-4. 外れ値と主成分分析 2

3.

7-1 主成分分析と次元削減 3

4.

次元と次元削減 属性 z を削除 x y z x y 0 -20 0 0 -20 10 20 0.1 10 20 元データ: 次元は3 次元は2 次元数は,レコードの中の数値属性の数 4

5.

データの中の主軸 2番目の軸 1番目の軸 元データ: 次元は2 元データ: 次元は2 5

6.

主成分分析 (principle component analysis) • 複数の変数から得られた標本をもとに,軸を得る ための方式 • 得られた「1番目の軸(主軸)」は,標本群の分 散が最大になるような軸である. 2番目の軸 1番目の軸 元データ: 次元は2 6

7.

主成分分析と次元削減 主成分分析で得られた上位の軸を残し、下位の軸を削除 2番目の軸 1番目の軸 元データ: 次元は2 1番目の軸 次元は1 7

8.

主成分分析の例 • 元データ 1番目の軸 2番目の軸 主成分分析の結果 8

9.

主成分分析の例 • 元データ 1番目の軸 2番目の軸 主成分分析の結果 9

10.

7-2 パッケージの追加インス トール 10

11.

パッケージの設定 • 次の手順で,必要なパッケージをインストール • パッケージをインストールするのにインターネッ ト接続が必要 • install.packages("ggplot2") を実行 • install.packages("pcaPP") を実行 11

12.

7-3 主成分分析の実行 12

13.

合成データからランダムに100個選び,主成 分分析を実施 合成データ サイズ100 の標本を2セット タイプ:数値(整数化しない) サイズ:100,000 主成分分析 x <- rnorm(100000, mean=5, sd=5) 合成データの生成 y <- rnorm(100000, mean=5, sd=5) n <- floor( runif(100, 1, 100000+1) ) d8 <- data.frame( xx=x[n], yy=y[n] ) d8$yy <- d8$yy - (d8$xx + d8$yy) * 0.6 合成データに library(ggplot2) 相関関係をもたせる ggplot(d8, aes(x=xx)) + geom_point( aes(y=yy), size=3 ) + theme_bw() a <- prcomp(d8) print(a$rotation) この2行が主成分分析 13

14.

合成データからランダムに100個選び標本を 作る 合成データ サイズ100 の標本を2セット タイプ:数値(整数化しない) サイズ:100,000 主成分分析 x <- rnorm(100000, mean=5, sd=5) 合成データの生成 y <- rnorm(100000, mean=5, sd=5) n <- floor( runif(100, 1, 100000+1) ) d9 <- data.frame( xx=x[n], yy=y[n] ) d9$yy <- d9$yy + (d9$xx - d9$yy) * 0.8 合成データに library(ggplot2) 相関関係をもたせる ggplot(d9, aes(x=xx)) + geom_point( aes(y=yy), size=3 ) + theme_bw() a <- prcomp(d9) print(a$rotation) この2行が主成分分析 14

15.

主成分分析 (principle component analysis) • 次元数が n のとき, n 個の軸が得られる • 1番目の軸(主軸)は,分散が最大になるような軸. • 2番目の軸は,1番目の軸方向の成分を取り除いた 残りで,分散が最大になる軸 • 3番目の軸は, 1, 2 番目の軸方向の成分を取り除 いた残りで,分散が最大になる軸 以上を n 個の軸を得るまで繰り返す • 得られた軸は,互いに直交(垂直に交わる) 15

16.

7-4 外れ値と主成分分析 16

17.

主成分分析は万能というわけではない ◆ 標本には,必ず「ノイズ」が混入する ◆ ノイズがランダム(無作為)のときは,求まる軸 の向きに影響を及ぼさない ◆ ノイズがランダムでないときは,求まる軸の向き に影響を及ぼす • 外れ値: 明らかにおかしな値 • 計測もれ: 値が 0 や 空 になっている • 手作業で「外れ値や計測もれなどの不正なデータ を取り除く」のが基本だが,自動で取り除くのが 困難な状況もある 17

18.

外れ値を含むデータの合成の例 d9 + d10 外れ値 x <- rnorm(100000, mean=5, sd=5) y <- rnorm(100000, mean=5, sd=5) n <- floor( runif(100, 1, 100000+1) ) d9 <- data.frame( xx=x[n], yy=y[n] ) d9$yy <- d9$yy + (d9$xx - d9$yy) * 0.8 d10 <- data.frame( xx=rnorm(10, mean=-20, sd=1), yy=rnorm(10, mean=5, sd = 1) ) d11 <- rbind( d9, d10 ) library(ggplot2) ggplot(d11, aes(x=xx)) + geom_point( aes(y=yy), size=3 ) + theme_bw() d11 外れ値が混入 外れ値の混入 18

19.

主成分分析は外れ値に弱い d9 d11 外れ値が混入 全データから 忠実に軸を 算出 19

20.

主成分分析は外れ値に弱い d11 主成分分析 x <- rnorm(100000, mean=5, sd=5) y <- rnorm(100000, mean=5, sd=5) n <- floor( runif(100, 1, 100000+1) ) d9 <- data.frame( xx=x[n], yy=y[n] ) d9$yy <- d9$yy + (d9$xx - d9$yy) * 0.8 d10 <- data.frame( xx=rnorm(10, mean=-20, sd=1), yy=rnorm(10, mean=5, sd = 1) ) d11 <- rbind( d9, d10 ) library(ggplot2) ggplot(d11, aes(x=xx)) + geom_point( aes(y=yy), size=3 ) + theme_bw() a <- prcomp(d11) print(a$rotation) 外れ値の混入 20

21.

主成分分析のバリエーション - robust PCA • 外れ値があるデータでも,主成分分析したい → この問題に取り組んだ手法が多数ある 例えば C. Croux, P. Filzmoser, M. Oliveira, (2007). Algorithms for Projection-Pursuit Robust Principal Component Analysis, Chemometrics and Intelligent Laboratory Systems, Vol. 87, pp. 218-225. 21

22.

主成分分析のバリエーション - Principle Component Pursuit • 計測漏れがあるデータでも,主成分分析したい → この問題に取り組んだ手法が多数ある 例えば Candes, E. J., Li, X., Ma, Y., & Wright, J. (2011). Robust principal component analysis?. Journal of the ACM (JACM), 58(3), 11 22

23.

robust PCA の実行結果例 pcaPP パッケージを使用 d9 d11 外れ値が混入 • PCA • Robust PCA 外れ値に対して ある程度の 耐性がある 23

24.

pcaPP パッケージを用いて robust PCA d11 x <- rnorm(100000, mean=5, sd=5) y <- rnorm(100000, mean=5, sd=5) n <- floor( runif(100, 1, 100000+1) ) d9 <- data.frame( xx=x[n], yy=y[n] ) d9$yy <- d9$yy + (d9$xx - d9$yy) * 0.8 d10 <- data.frame( xx=rnorm(10, mean=-20, sd=1), yy=rnorm(10, mean=5, sd = 1) ) d11 <- rbind( d9, d10 ) library(ggplot2) ggplot(d11, aes(x=xx)) + geom_point( aes(y=yy), size=3 ) + theme_bw() library(pcaPP) a2 <- PCAgrid(d11) print(a2$loadings) 外れ値の混入 24