Какой самый быстрый способ преобразовать корреляцию между вектором и матрицей в r?

#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. Вы имеете в виду, что вам не нужно сохранять эти значения? Вы бы использовали их «на лету» в своем цикле?