Мне нужно вычислить меру подобия, чтобы коэффициент Кости на больших матрицах (600 000 x 500) двоичных векторов в R. Для скорости я использую C/Rcpp. Функция работает отлично, но поскольку я не компьютерный ученый, я бы хотел знать, сможет ли он работать быстрее. Этот код подходит для параллелизации, но у меня нет опыта, параллельного C-коду.Ускорение вычисления коэффициента кости в C/Rcpp
Коэффициент кости - это простая мера сходства/несходства (в зависимости от того, как вы его принимаете). Предназначен для сравнения асимметричных двоичных векторов, то есть одна из комбинаций (обычно 0-0) не имеет значения, а соглашение (1-1 пары) имеет больший вес, чем несогласие (1-0 или 0-1 пары). Представьте себе следующую таблицу сопряженности:
1 0
1 a b
0 c d
коэффици- Dice является: (2 * а)/(2 * а + Ь + с)
Вот моя реализация 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] (http://gallery.rcpp.org)? –
Спасибо! Сделаю. Я создаю пакет вокруг него, который я буду публиковать на github дополнительно. –
Приятно видеть, что вы нашли хорошее решение. Не забудьте принять ваш ответ. – Roland