Rのバイナリベクトルの大きな行列(600,000 x 500)にわたってダイス係数を呼び出す類似度を計算する必要があります。速度に関してはC/Rcppを使用します。この機能は素晴らしく実行されますが、私はコンピュータ科学者ではないので、より速く実行できるかどうかを知りたいと思います。このコードは並列化に適していますが、Cコードを並列化する経験はありません。C/Rcppのダイス係数の計算速度を向上させる
ダイス係数は、類似性/非類似性の単純な尺度です(どのようにそれをとるかによって異なります)。これは、非対称バイナリベクトルを比較することを目的としており、組み合わせ(通常0-0)は重要ではなく、一致(1-1ペア)は不一致(1-0または0-1ペア)よりも重みが大きいことを意味します。次分割表を想像:
1 0
1 a b
0 c d
サイコロCOEFは次のとおりです。(2 * A)/(2 * A + B + C)ここで
は私のRcpp実装です:
library(Rcpp)
cppFunction('
NumericMatrix dice(NumericMatrix binaryMat){
int nrows = binaryMat.nrow(), ncols = binaryMat.ncol();
NumericMatrix results(ncols, ncols);
for(int i=0; i < ncols-1; i++){ // columns fixed
for(int j=i+1; j < ncols; j++){ // columns moving
double a = 0;
double d = 0;
for (int l = 0; l < nrows; l++) {
if(binaryMat(l, i)>0){
if(binaryMat(l, j)>0){
a++;
}
}else{
if(binaryMat(l, j)<1){
d++;
}
}
}
// compute Dice coefficient
double abc = nrows - d;
double bc = abc - a;
results(j,i) = (2*a)/(2*a + bc);
}
}
return wrap(results);
}
')
x <- rbinom(1:200000, 1, 0.5)
X <- matrix(x, nrow = 200, ncol = 1000)
system.time(dice(X))
user system elapsed
0.814 0.000 0.814
ニース。時間がある場合は、多分それを少しきれいにして、[Rcpp Gallery](http://gallery.rcpp.org)の投稿にしてください。 –
ありがとう!しましょう。私はgithubに投稿する予定のパッケージを作ります。 –
良い解決策を見つけてくれてうれしいです。あなたの答えを受け入れることを忘れないでください。 – Roland