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)を追記するのも良いかもしれない。