独立成分分析とPerfume

81
独立成分分析 : ICA 超入門 と ダイエッ@0kayu 2014. 6. 14 #tokyoR

description

第40回 tokyoRの資料です。

Transcript of 独立成分分析とPerfume

独立成分分析 : ICA 超入門 と ダイエット

@0kayu

2014. 6. 14 #tokyoR

自己紹介- @0kayu 岡 - 早稲田大学 M2 機械系 - 研究 機能的脳画像解析 - 来年 アドテク系の会社で働きます

http://sssslide.com/www.slideshare.net/tojimat/diet-by-r

前回の#tokyoR から

http://sssslide.com/www.slideshare.net/tojimat/diet-by-r

前回の#tokyoR から

私のRをはじめてからの体重の推移(軸省略)

やせよう…

やせよう…

なぜ続かなかった? データがとれること

なぜ続かなかった? データがとれること 外に出るのが辛い

そこで…

Perfume ダイエット

Perfumeダイエット

perfumeのダンスを解析 → やせやすいダンスを特定→その曲がはいってるBD購入

perfumeのダンスを解析 → やせやすいダンスを特定→その曲がはいってるBD購入

変数多そう…

もしかして: ICA

今日話すこと

1. 独立成分分析入門 ̶ {fastICA}

2. perfume への応用例

混ざった「会話」を分ける

元々は独立な会話 (信号)

混ざる mixed

混ざった「会話」を分ける

混合信号

混ざった「観測値」を分ける

混合信号

神経活動  内側/外側視覚関連領域  聴覚関連領域   Default mode network + 頭の動き + 拍動 etc…

観測値

混合信号観測値

混ざった「観測値」を分ける

Kelly, R. E., Alexopoulos, et.al. (2010). 189(2), 233–45.

共通点 混ざった信号を分ける

元々は独立 な会話(信号)

独立成分分析

定式化

定式化観測値xは、独立な成分s1(t)とs2(t)を足し合わせたもの

定式化観測値xは、独立な成分s1(t)とs2(t)を足し合わせたもの

混合行列 独立成分観測値

で、独立成分分析?!

次の仮定を元に、

混合行列Aと信号sを

推定すること

仮定

統計的に独立であること

独立成分が正規分布に従わないこと(非ガウス的)

仮定

統計的に独立であること

独立成分が正規分布に従わないこと(非ガウス的)

統計的に独立 相関が 0

片方の変数がどのような値をとってももう片方の分布は変わらないこと

例えば、xとyが統計的に独立なら、以下の式が成り立つ

仮定

統計的に独立であること

独立成分が正規分布に従わないこと(非ガウス的)

仮定

統計的に独立であること

独立成分が正規分布に従わないこと(非ガウス的)

正規分布に従わない

正規分布に従わない

ラプラス分布 ガンマ分布

とりあえず 見てみよう

準備 ラプラス分布に従う変数rlaplace <- function(n) { u <- log(runif(n)) v <- ifelse(runif(n)>1/2, 1, -1) return(u*v) } rnorm(2) !S <- cbind( rlaplace(4000), 0.5 * rlaplace(4000))

準備 ラプラス分布に従う変数rlaplace <- function(n) { u <- log(runif(n)) v <- ifelse(runif(n)>1/2, 1, -1) return(u*v) } rnorm(2) !S <- cbind( rlaplace(4000), 0.5 * rlaplace(4000))!

!

A <- matrix(c(-1.5, 0.8 , 0.5, -1.8), 2, 2, byrow = TRUE) X <- S %*% A

#混合行列

{fastICA}> fastICA <- fastICA(X, 2, alg.typ = "parallel", fun = "logcosh", alpha = 1, method = "R", row.norm = FALSE, maxit = 200, tol = 0.0001, verbose = TRUE) !Centering Whitening Symmetric FastICA using logcosh approx. to neg-entropy function Iteration 1 tol = 0.0299405 Iteration 2 tol = 0.02635252 Iteration 3 tol = 0.002078679 Iteration 4 tol = 7.392618e-06

{fastICA}

#結果の描画 > par(mfrow=c(1,3)) > plot(fastICA$X, main = "Pre-processed data", cex=0.1) #中心化 > plot(fastICA$X %*% fastICA$K, main = "PCA components", cex=0.1) #白色化 > plot(fastICA$S, main = "ICA components", cex=0.1) #独立成分

{fastICA} - fastICA()fastICA(X, #[サンプル] x [観測値] の行列 n.comp, #分解するICの数 alg.typ = c(“parallel","deflation"), #ICを同時に推定するか fun = c("logcosh","exp"),         #G関数の形を決める alpha = 1.0,       #neg-entropyの形が"logcosh"のときに設定   #1~2 の間の定数 #αの値によって収束するまでの早さが変わる method = R, #R→R言語で計算、C→C言語で計算 row.norm = FALSE, #Xが規格化されているかどうか maxit = 200, #イテレーションの回数のリミット値 tol = 1e-04, #un-mixing matrixが収束したか決めるときのしきい値 verbose = FALSE, #結果をコンソールに表示するかどうか w.init = NULL #非混合行列の初期値 )

{fastICA} - fastICA()fastICA(X, #[サンプル] x [観測値] の行列 n.comp, #分解するICの数 alg.typ = c(“parallel","deflation"), #ICを同時に推定するか fun = c("logcosh","exp"),         #G関数の形を決める alpha = 1.0,       #neg-entropyの形が"logcosh"のときに設定   #1~2 の間の定数 #αの値によって収束するまでの早さが変わる method = R, #R→R言語で計算、C→C言語で計算 row.norm = FALSE, #Xが規格化されているかどうか maxit = 200, #イテレーションの回数のリミット値 tol = 1e-04, #un-mixing matrixが収束したか決めるときのしきい値 verbose = FALSE, #結果をコンソールに表示するかどうか w.init = NULL #非混合行列の初期値 )

G 関数 … ?

negentropy ? entropy ?

negentropy ? entropy ?

アルゴリズム の流れ

{fastICA} アルゴリズム1. 前処理パート

1. 中心化 各観測値の平均を0 2. 白色化 分散を等方的にする

2. 非ガウス性を最大に 回転して、正規分布からかけ離れた分布にする

{fastICA} アルゴリズム1. 前処理パート

1. 中心化 各観測値の平均を0 2. 白色化 分散を等方的にする

2. 非ガウス性を最大に 回転して、正規分布からかけ離れた分布にする

{fastICA} アルゴリズム1. 前処理パート

1. 中心化 各観測値の平均を0 2. 白色化 分散を等方的にする

2. 非ガウス性を最大に 回転して、正規分布からかけ離れた分布にする

ど う や っ て ?

negentropy entropy ?

ネゲントロピーある確率変数Xと、同じ分散をもつ正規確率変数Nのエントロピーの差

情報エントロピーH(X)が最大 → ばらつきが大きい

情報エントロピーH(X)が最小 → ばらつきが小さい

ネゲントロピー :近似 G関数を用いて近似することにより、計算が容易になる

さっきのは これ

{fastICA} - fastICA()fastICA(X, #[サンプル] x [観測値] の行列 n.comp, #分解するICの数 alg.typ = c(“parallel","deflation"), #ICを同時に推定するか fun = c("logcosh","exp"),         #G関数の形を決める alpha = 1.0,       #neg-entropyの形が"logcosh"のときに設定   #1~2 の間の定数 #αの値によって収束するまでの早さが変わる method = R, #R→R言語で計算、C→C言語で計算 row.norm = FALSE, #Xが規格化されているかどうか maxit = 200, #イテレーションの回数のリミット値 tol = 1e-04, #un-mixing matrixが収束したか決めるときのしきい値 verbose = FALSE, #結果をコンソールに表示するかどうか w.init = NULL #非混合行列の初期値 )

復習

#結果の描画 > par(mfrow=c(1,3)) > plot(fastICA$X, main = "Pre-processed data", cex=0.1) #中心化 > plot(fastICA$X %*% fastICA$K, main = "PCA components", cex=0.1) #白色化 > plot(fastICA$S, main = "ICA components", cex=0.1) #独立成分

中心化 白色化 回転

独立 成分 分析 ?主 成分 分析 ? 因 子 分析 ?

主成分分析 overview 定式化 & ポイント !

-  主成分は互いに相関はない(でも独立ではない) -  主成分は、すべて正規分布に沿っている

✓  正規分布の場合、相関が0なら独立性が保証される

使われ方 - 次元を削減する方法として用いられる - ICA では、PCAを白色化のときに用いている。PCAの次元が独立成分の要素の数に一致する

くわしくは

http://www.slideshare.net/sanoche16/tokyor31-22291701 !

独立成分分析 vs 主成分分析散布図で見ると

PCAは分散が最大の方向に基底をとる 次の基底はその基底に直交するようにとる

第一主成分

第二主成分

独立成分分析 vs 主成分分析散布図で見ると

基底同士は直交 しなくてもよい

独立成分分析を極めるなら

入門 独立成分分析村田 昇

詳解 独立成分分析―信号解析の新しい世界 Aapo Hyvarinen , Juha Karhunen, Erkki Oja

基本的な解法, 他の分析法との違い

基本的な解法, ノイズ有のICA 他の分析法との違い

今日話すこと

1. 独立成分分析入門 ̶ {fastICA}

2. perfume への応用例

Perfume (復習)

Perfume (復習) !

!

ん … ?

ん … ?

http://perfume-global.com/project.html

Perfume global project # 001 モーションキャプチャーデータを配布

perfume , モーションキャプチャ

重要な参考文献 3相主成分分析を用いた解析

http://researchmap.jp/?action=cv_download_main&upload_id=42728

perfume + ダンス×

主成分分析

perfume , モーションキャプチャ HIERARCHY ROOT Hips { OFFSET 0.000000 0.000000 0.000000 CHANNELS 6 Xposition Yposition Zposition Yrotation Xrotation Zrotation JOINT Chest { OFFSET 0.000000 10.678932 0.006280 CHANNELS 3 Yrotation Xrotation Zrotation …, } MOTION Frames: 2820 Frame Time: 0.025000 20.126024 83.31402 -18.424651 -9.129106 -6.517021 -0.118878 0.085519 9.753561 -0.537233 -0.010346 -5.417462 -0.070241 0.024747 1.596753 -0.097771 0.076825 0.255045 0.028866 -2.676143 13.137455 -0.003003 -4.902355 -11.317583 0.237067 0.227179 0.185755 0.125412 -0.119016 -11.836501 1.407777 2.313914 -7.359847 2.184012 7.121591 -4.059673 0.32346 0.027243 -2.476878 -0.074028 -0.097043 -7.619834 0.032649 -60.980338 -2.129588 -0.11772 0.245169 0.021119 9.869842 0.042872 8.453526 -4.572724 -3.248217 1.906954 -0.671854 2.029124 -4.900362 6.1163 0.030989 -0.279999 -0.068954 -11.233479 -12.051593 0.062998 1.140721 1.950329 1.686051 -0.00394 -4.658935 -8.5305 0.029141 -0.060092 0.0284

perfume , モーションキャプチャ お尻の位置x y z 角度Zrot Yrot Xrot 肩Yrot Xrot Zrot

perfume データ準備notch <- read.table("notch.dat", header = F) aachan <- read.table("aachan.dat", header = F) kashiyuka <- read.table("kashiyuka.dat", header = F) X <- cbind(notch[,1], aachan[,1], kashiyuka[,1])

notch Y rot aachan Y rot kashiyuka Y rot

主成分分析Newperfume1 = {} Newperfume2 = {} !for( i in c(1:ncol(notch))){ X <- cbind(notch[,i], aachan[,i], kashiyuka[,i]) PCA <- prcomp(X) Newperfume1 <- cbind(Newperfume1,PCA$x[,1]) Newperfume2 <- cbind(Newperfume2,PCA$x[,2]) } write.table(x=round(Newperfume1,6), file="Newperfume1_PCA.bvh",row.names=F, col.names=F) write.table(x=round(Newperfume2,6), file="Newperfume2_PCA.bvh",row.names=F, col.names=F) !

主成分分析 !

→ 分散が大きい方向に主成分

チェック!

http://game.akjava.com/creator/

のっち

PCA1

PCA2

浮いてる… ?

perfume + ダンス×

独立成分分析

独立成分分析Newperfume1 = {} Newperfume2 = {} for( i in c(1:ncol(notch))){ X <- cbind(notch[,i], aachan[,i], kashiyuka[,i]) fastICA <- fastICA(X, 2, alg.typ = "parallel", fun = "logcosh", alpha = 1, method = "R", row.norm = FALSE, maxit = 200, tol = 0.0001, verbose = TRUE) matplot(fastICA$S, type = "l", lty = 1) fastICA$S[,1] = mean(fastICA$A[1,])*fastICA$S[,1]+mean(X) fastICA$S[,2] = mean(fastICA$A[2,])*fastICA$S[,2]+mean(X) Newperfume1 <- cbind(Newperfume1, fastICA$S[,1]) Newperfume2 <- cbind(Newperfume2, fastICA$S[,2]) }

チェック!

http://game.akjava.com/creator/

のっち

IC1 IC2

人間っぽい

 ENJOY !