R言語で車輪の再発明 - arosh/arosh.github.com GitHub Wiki
白色化
whitenが標準ライブラリになぜか見つからない。
定義にしたがって書くと以下のようになる。
sweepを使っているあたりが若干闇っぽい(どうしてNumpyのブロードキャストが使えないんだ…)。変形すれば転置が1回に減らせるような気がしなくもない。速度を気にするなら、対角行列を陽に持たなくても済むように工夫するべきである。
whiten <- function(x) {
eig <- eigen(var(x))
u <- diag(sqrt(1.0 / eig$values)) %*% t(eig$vectors) %*% t(sweep(x, 2, colMeans(x)))
return(t(u))
}
標準ライブラリにscaleはあるので、流用してみると少し簡単になる。転置行列の乗算を無くしてみた。
whiten <- function(x) {
eig <- eigen(var(x))
u <- as.matrix(x) %*% eig$vectors
return(scale(u))
}
列名の情報が消えてしまうので、colnames(u) <- colnames(x)
を追記するのも良いかもしれない。