#r #parallel-processing #correlation
#r #параллельная обработка #корреляция
Вопрос:
Я пытаюсь найти быстрый способ вычислить корреляцию между вектором значений и матрицей. У меня есть фрейм данных с 200 строками и 400 000 наблюдений после переноса данных. Мне нужно найти соответствие между каждым столбцом и любым другим столбцом.
Мой код приведен ниже, но он слишком медленный. Кто-нибудь может предложить более быстрый способ.
for(i in 1:400000){
x=cor(trainDataNew[,i],trainDataNew[,-i])
}
Для этого вам не нужны мои данные. Вы можете создавать случайные данные, как показано ниже.
norm1 <- rnorm(1000)
norm2 <- rnorm(1000)
norm3 <- rnorm(1000)
as.data.frame(cbind(norm1,norm2,norm3))
Ответ №1:
Что не так с
cc <- cor(trainDataNew)
?
Если вам нужен только нижний треугольник, вы можете использовать
cc2 <- cc[lower.tri(cc,diag=FALSE)]
В этом сообщении в блоге утверждается, что аналогичная по размеру (немного меньшая) задача была решена примерно за минуту. Их подход реализован в HiClimR::fastCor
.
library(HiClimR)
system.time(cc <- fastCor(dd, nSplit = 10,
upperTri = TRUE, verbose = TRUE,
optBLAS=TRUE))
У меня это еще не заработало (постоянно не хватает памяти), но вам, возможно, повезет больше. Вам также следует изучить возможность привязки R к оптимизированному BLAS, например, смотрите здесь для macOS.
Кто-то здесь сообщает о распараллеленной версии (код находится здесь вместе с некоторыми раздвоенными версиями)
Комментарии:
1. У меня есть фрейм данных с 400 000 столбцами. Это составило бы матрицу размером 400 000 столбцов на 400 000 строк. У меня закончилась бы память. Я только что запустил cor с 50 000 столбцами и получил ошибку: не удается выделить вектор размером 18,6 Гб
2. Вы имеете в виду, что вам не нужно сохранять эти значения? Вы бы использовали их «на лету» в своем цикле?