2

ユーザー、

pprocessing 時間を節約するために、PLSR 予測を「並列化」するソリューションを探しています。「doPar」で「foreach」コンストラクトを使用しようとしましたが (以下のコードの 2 番目の部分を参照)、予測値とモデル パフォーマンス パラメーター (RMSEP) を出力変数に割り当てることができませんでした。

コード:

set.seed(10000)   # generate some data...
mat <- replicate(100, rnorm(100))
y <- as.matrix(mat[,1], drop=F)
x <- mat[,2:100]
eD <- dist(x, method = "euclidean")  # distance matrix to find close samples
eDm <- as.matrix(eD)
kns <- matrix(NA,nrow(x),10)  # empty matrix to allocate 10 closest samples
for (i in 1:nrow(eDm)) {   # identify closest samples in a loop and allocate to kns
     kns[i,] <- head(order(eDm[,i]), 11)[-1]
}

これまでのところ、コードは「安全」であると考えていますが、「foreach」構造をこれまで使用したことがないため、次の部分は私に挑戦しています。

  library(pls)
    library(foreach)
    library(doParallel)
    cl <- makeCluster(2)
    registerDoParallel(cl)
    out <- foreach(j = 1:nrow(mat), .combine="rbind", .packages="pls") %dopar% {
                    pls <- plsr(y ~ x, ncomp=5, validation="CV", , subset=kns[j,])
                    predict(pls, ncomp=5, newdata=x[j,,drop=F])
                    RMSEP(pls, estimate="CV")$val[1,1,5]
    }
    stopCluster(cl)

私が理解しているように、「RMSEP(pls,...」で始まるコード行は、「予測」コード行から以前に書き込まれたデータを単に上書きしているだけです。どういうわけか、.combineオプションがこれを処理すると想定していましたか?

助けてくれて本当にありがとうございます!

ベスト、チェガ

4

2 に答える 2

0

この質問は最初に回答があったため、クロス検証を並行して実行できるようにpls パッケージが変更されました。実装は非常に簡単です。単純に、永続的なクラスターを定義するか、一時的なクラスターで使用するコアの数を で定義するだけですpls.options

一時的なクラスターを使用する場合、実装には文字通り 2 行のコードしか必要ありません。

library(parallel) 
pls.options(parallel=NumberOfCoresToUse)

出力変数を変更する必要はありません。

質問のように、キャリブレーションレベルでの並列化がより効率的かどうかは確認していません。特に、キャリブレーションの反復回数が相互検証ステップの回数よりもはるかに多い場合 (特に、CV の数が使用されるコアの数の倍数ではない場合) はそうなると思いますが、このアプローチは非常に簡単です。余分なコーディング作業は価値がないかもしれません。

于 2015-04-23T16:39:41.247 に答える