R のバイナリ ベクトルの大きな行列 (600,000 x 500) で、類似性測定値と呼ばれる Dice 係数を計算する必要があります。速度のために、C / Rcpp を使用します。この関数はうまく動作しますが、私はバックグラウンドでコンピューター科学者ではないため、より高速に実行できるかどうかを知りたい. このコードは並列化に適していますが、C コードを並列化した経験はありません。
ダイス係数は、類似度/非類似度の単純な尺度です (見方によって異なります)。非対称バイナリ ベクトルを比較することを目的としています。つまり、組み合わせの 1 つ (通常は 0-0) は重要ではなく、一致 (1-1 ペア) は不一致 (1-0 または 0-1 ペア) よりも重みがあります。次の分割表を想像してください。
1 0
1 a b
0 c d
サイコロ係数は次のとおりです。(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