Muszę obliczyć miarę podobieństwa, wywołując współczynnik Dice na dużych macierzach (600 000 x 500) wektorów binarnych w R. Dla prędkości używam C/Rcpp. Ta funkcja działa świetnie, ale ponieważ nie jestem informatykiem w tle, chciałabym wiedzieć, czy mogłaby działać szybciej. Ten kod jest odpowiedni do równoległości, ale nie mam doświadczenia z równoległym kodowaniem C.Przyspieszenie obliczeń współczynnika Dice w C/Rcpp
Współczynnik kości jest prostą miarą podobieństwa/odmienności (w zależności od tego, jak ją bierzesz). Ma on na celu porównanie asymetrycznych wektorów binarnych, co oznacza, że jedna z kombinacji (zwykle 0-0) nie jest ważna, a zgodność (1-1 par) ma większą wagę niż różnica zdań (1-0 lub 0-1 par). Wyobraźmy sobie następującą tabelę awaryjnych:
1 0
1 a b
0 c d
Dice COEF jest: (2 * a)/(2 * a + b + c)
Oto moja realizacja 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);
}
')
i tu jest uruchomiony przykład:
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
Nice. Jeśli masz trochę czasu, możesz trochę posprzątać i uczynić go postem dla [Galerii Rcpp] (http://gallery.rcpp.org)? –
Dzięki! Zrobi to. Tworzę wokół niego paczkę, którą opublikuję dodatkowo na githubie. –
Dobrze, że znalazłeś dobre rozwiązanie. Nie zapomnij przyjąć odpowiedzi. – Roland