Какой самый быстрый способ преобразовать корреляцию между вектором и матрицей в r? - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь найти быстрый способ вычислить корреляцию между вектором значений и матрицей. У меня есть фрейм данных с 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 Ответ

2 голосов
/ 28 марта 2019

Что не так с

cc <- cor(trainDataNew)

?

Если вам нужен только нижний треугольник, вы можете использовать

cc2 <- cc[lower.tri(cc,diag=FALSE)]

Этот блогpost утверждает, что выполнил проблему аналогичного размера (чуть меньше) примерно за минуту.Их подход реализован в HiClimR::fastCor.

library(HiClimR)
system.time(cc <- fastCor(dd, nSplit = 10, 
        upperTri = TRUE, verbose = TRUE,
        optBLAS=TRUE))

Я еще не получил эту работу (не хватает памяти), но вам, возможно, повезет больше.Вам также следует обратить внимание на связь R с оптимизированным BLAS, например, см. здесь для MacOS.

Кто-то здесь сообщает о распараллеленной версии (код здесь , вместе с некоторыми разветвленными версиями)

...