「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
当然,速いに決まっているわ~な(^_^)
最新の画像[もっと見る]
- 算額(その2135) 9時間前
- 算額(その2134) 16時間前
- 算額(その2133) 1日前
- 算額(その2132) 3日前
- 算額(その2131) 4日前
- 算額(その2130) 4日前
- 算額(その2129) 5日前
- 算額(その2128) 5日前
- 算額(その2127) 6日前
- 算額(その2126) 6日前
※コメント投稿者のブログIDはブログ作成者のみに通知されます