2

私の R スクリプトの問題は、時間がかかりすぎることです。私が検討している主な解決策は、それを並列化することです。どこから始めればよいかわかりません。

私のコードは次のようになります。

n<- nrow (aa) 
output <- matrix (0, n, n)

akl<- function (dii){
        ddi<- as.matrix (dii)
        m<- rowMeans(ddi)
        M<- mean(ddi)
        r<- sweep (ddi, 1, m)
        b<- sweep (r, 2, m)
        return (b + M)  
        }
for (i in 1:n)
{
A<- akl(dist(aa[i,]))

dVarX <- sqrt(mean (A * A))

for (j in i:n)
{
    B<- akl(dist(aa[j,]))
        V <- sqrt (dVarX * (sqrt(mean(B * B))))

        output[i,j] <- (sqrt(mean(A * B))) / V        
}
}   

異なるCPUで並列化したい。どうやってやるの?SNOWパッケージを見ましたが、私の目的に合っていますか? 提案をありがとう、ガブ

4

1 に答える 1

5

コードをより高速に実行する方法として、次の 2 つの方法が考えられます。

First:(少しひねりを加えて) 言っていたように、akl@Dwinを実行できprecomputeます (はい、必ずしも dist ではなく、akl の全体)。

# a random square matrix
aa <- matrix(runif(100), ncol=10)
n <- nrow(aa)
output <- matrix (0, n, n)

akl <- function(dii) {
    ddi <- as.matrix(dii)
    m   <- rowMeans(ddi)
    M   <- mean(m) # mean(ddi) == mean(m)
    r   <- sweep(ddi, 1, m)
    b   <- sweep(r, 2, m)
    return(b + M)
}

# precompute akl here
require(plyr)
akl.list <- llply(1:nrow(aa), function(i) {
    akl(dist(aa[i, ]))
})

# Now, apply your function, but index the list instead of computing everytime
for (i in 1:n) {
    A     <- akl.list[[i]]
    dVarX <- sqrt(mean(A * A))

    for (j in i:n) {
        B <- akl.list[[j]]
        V <- sqrt (dVarX * (sqrt(mean(B * B))))
        output[i,j] <- (sqrt(mean(A * B))) / V        
    }
}

これにより、コードが以前よりも高速に実行されるはずです (内側のループで毎回 akl を計算するため)。

Second:それに加えて、次のように並列化することで高速化できます。

# now, the parallelisation you require can be achieved as follows
# with the help of `plyr` and `doMC`.

# First step of parallelisation is to compute akl in parallel
require(plyr)
require(doMC)
registerDoMC(10) # 10 Cores/CPUs
    akl.list <- llply(1:nrow(aa), function(i) {
    akl(dist(aa[i, ]))
}, .parallel = TRUE)

# then, you could write your for-loop using plyr again as follows
output <- laply(1:n, function(i) {
    A     <- akl.list[[i]]
    dVarX <- sqrt(mean(A * A))

    t <- laply(i:n, function(j) {
        B <- akl.list[[j]]
        V <- sqrt(dVarX * (sqrt(mean(B*B))))
        sqrt(mean(A * B))/V
    })
    c(rep(0, n-length(t)), t)
}, .parallel = TRUE)

.parallel = TRUE外側のループにのみ追加したことに注意してください。これは、外側のループに 10 個のプロセッサを割り当てるためです。これを外側ループと内側ループの両方に追加すると、プロセッサの総数は 10 * 10 = 100 になります。これに注意してください。

于 2013-01-14T11:03:29.880 に答える