裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

題意に沿えばよいだけだろう

2012年05月18日 | ブログラミング

Rコードの最適化例:混合正規乱数の発生コード」 にあるんだが,なんだかなあ

結局 N1 に従う乱数の個数 n1 が決まれば良いと喝破(なるほど)

rmixnorm3 <- function(n, p1, N1, N2) {
   n1 <- sum(runif(n) < p1)
   c( N1[2]*rnorm(n1) + N1[1], N2[2]*rnorm(n-n1)+N2[1] )
}

rmixnorm4 <- function(n, p1, N1, N2) {
   n1 <- sum(runif(n) < p1)
   c( rnorm(n1, m=N1[1], s=N1[2]), rnorm(n-n1, m=N2[1], s=N2[2]) )
}

何が喝破か。
確率 0.6 で混合」と書いてあるのに,何が悲しくて「その個数を決める」のに,sum(runif(n) < p1) なんかやるの!!
n*p1 でよいでしょうが(必要なら整数に丸めないといけないけど)。ということで,rmixnorm5 を定義して,ベンチマーク。

rmixnorm5 <- function(n, p1, N1, N2) {
   n1 <- round(n*p1)
   c( rnorm(n1, m=N1[1], s=N1[2]), rnorm(n-n1, m=N2[1], s=N2[2]) )
}

library(rbenchmark)
benchmark(rmixnorm(1e6, 0.4, c(-1,1), c(3,2)), rmixnorm2(1e6, 0.4, c(-1,1), c(3,2)), rmixnorm3(1e6, 0.4, c(-1,1), c(3,2)), rmixnorm4(1e6, 0.4, c(-1,1), c(3,2)), rmixnorm5(1e6, 0.4, c(-1,1), c(3,2)), replications=100)

                                      test replications elapsed relative user.self sys.self
1  rmixnorm(1e+06, 0.4, c(-1, 1), c(3, 2))          100  19.705 2.039644    17.734    2.418
2 rmixnorm2(1e+06, 0.4, c(-1, 1), c(3, 2))          100  22.562 2.335369    20.642    2.233
3 rmixnorm3(1e+06, 0.4, c(-1, 1), c(3, 2))          100  13.959 1.444881    13.148    0.945
4 rmixnorm4(1e+06, 0.4, c(-1, 1), c(3, 2))          100  13.103 1.356278    12.720    0.467
5 rmixnorm5(1e+06, 0.4, c(-1, 1), c(3, 2))          100   9.661 1.000000     9.333    0.392

当然,速いに決まっているわ~な(^_^)

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 最適化なんかしなくてよい その5 | トップ | 質問が不得意だと自覚できな... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事