Ho bisogno di calcolare una misura di similitudine chiamare il coefficiente Dice su grandi matrici (600.000 x 500) di vettori binari in R. Per velocità uso C/Rcpp. La funzione funziona alla grande ma, poiché non sono un informatico di base, vorrei sapere se potrebbe funzionare più velocemente. Questo codice è adatto per la parallelizzazione ma non ho esperienza parallelizzando il codice C.Accelerare il calcolo del coefficiente di Dice in C/Rcpp
Il coefficiente dei dadi è una semplice misura di somiglianza/dissomiglianza (a seconda di come la si prende). Si intende confrontare i vettori binari asimmetrici, ovvero una delle combinazioni (solitamente 0-0) non è importante e l'accordo (1-1 coppie) ha più peso che disaccordo (coppie 1-0 o 0-1). Immaginate la seguente tabella di contingenza:
1 0
1 a b
0 c d
Il coef dadi è: (2 * a)/(2 * a + b + c)
Qui è la mia realizzazione 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);
}
')
ed ecco un esempio in esecuzione:
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
Bello. Se hai un po 'di tempo, forse pulisci un po' e rendilo un post per la [Rcpp Gallery] (http://gallery.rcpp.org)? –
Grazie! Andrà bene. Costruisco un pacchetto che pubblicherò su Github in aggiunta. –
È bello vedere che hai trovato una buona soluzione. Non dimenticare di accettare la tua risposta. – Roland