独立成分分析とPerfume
description
Transcript of 独立成分分析とPerfume
準備 ラプラス分布に従う変数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 #非混合行列の初期値 )
{fastICA} アルゴリズム1. 前処理パート
1. 中心化 各観測値の平均を0 2. 白色化 分散を等方的にする
2. 非ガウス性を最大に 回転して、正規分布からかけ離れた分布にする
ど う や っ て ?
{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の次元が独立成分の要素の数に一致する
独立成分分析を極めるなら
入門 独立成分分析村田 昇
詳解 独立成分分析―信号解析の新しい世界 Aapo Hyvarinen , Juha Karhunen, Erkki Oja
基本的な解法, 他の分析法との違い
基本的な解法, ノイズ有のICA 他の分析法との違い
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 データ準備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) !
独立成分分析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]) }