ブートストラップ機能をスピードアップしたいと思います。私はR 2.14以来、parallel
と呼ばれるパッケージがありますが、私はそれがsbにとって非常に難しいと感じています。それを実際に実装するためのコンピュータサイエンスの知識は低いです。たぶん誰かが助けることができます。R並列を使用してブートストラップを高速化する
は、そこでここでは、ブートストラップを持っている:
n<-1000
boot<-1000
x<-rnorm(n,0,1)
y<-rnorm(n,1+2*x,2)
data<-data.frame(x,y)
boot_b<-numeric()
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
boot_b[i]<-lm(y~x,bootstrap_data)$coef[2]
print(paste('Run',i,sep=" "))
}
目標は、私のPCの複数のコアを活用/並列処理を使用することです。私はWindows上でRを実行しています。ありがとう! (ノアによって返信後)
EDIT
次の構文は、テストのために使用することができる。
library(foreach)
library(parallel)
library(doParallel)
registerDoParallel(cores=detectCores(all.tests=TRUE))
n<-1000
boot<-1000
x<-rnorm(n,0,1)
y<-rnorm(n,1+2*x,2)
data<-data.frame(x,y)
start1<-Sys.time()
boot_b <- foreach(i=1:boot, .combine=c) %dopar% {
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
unname(lm(y~x,bootstrap_data)$coef[2])
}
end1<-Sys.time()
boot_b<-numeric()
start2<-Sys.time()
for(i in 1:boot){
bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
boot_b[i]<-lm(y~x,bootstrap_data)$coef[2]
}
end2<-Sys.time()
start1-end1
start2-end2
as.numeric(start1-end1)/as.numeric(start2-end2)
しかし、私のマシン上で単純なRコードが速いです。これは並列処理の既知の副作用の1つです。つまり、このような「単純なタスク」で時間に追加されるプロセスをフォークするオーバーヘッドが発生しますか?
編集:私のマシンでは、parallel
コードは「シンプル」コードよりも約5倍の時間がかかります。この要因は、タスクの複雑さを増やす(例:boot
またはn
を増やす)と、明らかに変化しません。だから、コードやマシン(Windowsベースの処理?)に問題があるかもしれません。
ありがとう、私はテスト(上記の編集済みのコード)に提案された構文を和解しました。現在、CPUの100%(つまりすべてのプロセッサ)を使用しています。しかし、これは並列処理なしで行うよりも遅いです(上記を参照)。 – tomka
時間の問題について追加の提案をすることができればすばらしいです。つまり、あなたの提案がスピードアップしないのはなぜですか?ありがとう。 – tomka
Hmm。面白い。私のマシン(8 HTコア、8 GB RAM、Ubuntu 12.04)では、RAMの使用量はほとんどなく、約3.4倍のスピードアップを得ました。私はWindows環境でのマルチスレッドに精通していません。試してみるべきことがいくつかあります: – Noah