Р .: Существует ли быстрая библиотека приблизительных корреляций для больших временных рядов? - PullRequest
0 голосов
/ 15 февраля 2012

Я пытаюсь создать программное обеспечение, которое в режиме реального времени найдет верхние N окон коррелированных временных рядов (для ряда запросов).

Имеется приблизительно 5000 окон, каждая из которых имеет длину 34 строки.Что касается серии запросов, мне нужно 300 наиболее коррелированных окон.

В настоящее время я использую функцию cor, но она оказывается слишком медленной.Мне нужно время отклика менее секунды.Под 250 мс было бы здорово, но все, что в этом районе подойдет.

Существует ли библиотека «быстрой приблизительной корреляции» для R, которую я могу использовать, чтобы уменьшить размер моего большого «списка участников» (5000 окон)?

Если нет, есть ли другая?способ несколько сократить этот список?

Вот функция, которую я выполняю:

GetTopN<-function(n)
{ 
  Rprof()

  x<- LastBars()
  x<-as.data.frame(cbind(x[-1,1],diff(x[,2])))

  colnames(x)<-c('RPos','M1')
  actionlist<-GetFiltered()
  print(nrow(actionlist))
  crs<-mat.or.vec(nrow(actionlist),2) #will hold correlations  


  for(i in 1:nrow(actionlist))
  {

       crs[i,2]<-cor(z[actionlist$RPos[i]+n1,2],x[,2])  
  }

  crs[,1]<-actionlist$OpenTime
  sorted <- crs[order(crs[,2], decreasing=T),1:2] 
  topx<- head(sorted,n)
  bottomx <- tail(sorted,n)
  rownames(bottomx)<-NULL
  DF<-as.data.frame(rbind(topx,bottomx),row.names=NULL ) 
  colnames(DF)<-c('ptime','weight')  
  sqlSave(channel,dat=DF,tablename='ReducedList',append=F,rownames=F,safer=F) 
  FillActionList()
  Rprof(NULL)
  summaryRprof()  
}

А вот вывод из summaryRprof:

$by.self
              self.time self.pct total.time total.pct
[.data.frame       0.68    25.37       0.98     36.57
.Call              0.22     8.21       0.22      8.21
cor                0.16     5.97       2.30     85.82
is.data.frame      0.14     5.22       1.26     47.01
[                  0.14     5.22       1.12     41.79
stopifnot          0.14     5.22       0.30     11.19
sys.call           0.14     5.22       0.18      6.72
GetTopN            0.12     4.48       2.68    100.00
eval               0.10     3.73       0.46     17.16
deparse            0.10     3.73       0.34     12.69
%in%               0.10     3.73       0.22      8.21
$                  0.10     3.73       0.10      3.73
c                  0.08     2.99       0.08      2.99
.deparseOpts       0.06     2.24       0.14      5.22
formals            0.06     2.24       0.08      2.99
pmatch             0.06     2.24       0.08      2.99
names              0.06     2.24       0.06      2.24
match              0.04     1.49       0.12      4.48
sys.parent         0.04     1.49       0.04      1.49
match.arg          0.02     0.75       0.58     21.64
length             0.02     0.75       0.02      0.75
matrix             0.02     0.75       0.02      0.75
mode               0.02     0.75       0.02      0.75
order              0.02     0.75       0.02      0.75
parent.frame       0.02     0.75       0.02      0.75
sys.function       0.02     0.75       0.02      0.75

$by.total
              total.time total.pct self.time self.pct
GetTopN             2.68    100.00      0.12     4.48
cor                 2.30     85.82      0.16     5.97
is.data.frame       1.26     47.01      0.14     5.22
[                   1.12     41.79      0.14     5.22
[.data.frame        0.98     36.57      0.68    25.37
match.arg           0.58     21.64      0.02     0.75
eval                0.46     17.16      0.10     3.73
deparse             0.34     12.69      0.10     3.73
stopifnot           0.30     11.19      0.14     5.22
.Call               0.22      8.21      0.22     8.21
%in%                0.22      8.21      0.10     3.73
sqlQuery            0.20      7.46      0.00     0.00
sys.call            0.18      6.72      0.14     5.22
odbcQuery           0.18      6.72      0.00     0.00
GetFiltered         0.16      5.97      0.00     0.00
match.call          0.16      5.97      0.00     0.00
.deparseOpts        0.14      5.22      0.06     2.24
match               0.12      4.48      0.04     1.49
$                   0.10      3.73      0.10     3.73
c                   0.08      2.99      0.08     2.99
formals             0.08      2.99      0.06     2.24
pmatch              0.08      2.99      0.06     2.24
names               0.06      2.24      0.06     2.24
sys.parent          0.04      1.49      0.04     1.49
LastBars            0.04      1.49      0.00     0.00
length              0.02      0.75      0.02     0.75
matrix              0.02      0.75      0.02     0.75
mode                0.02      0.75      0.02     0.75
order               0.02      0.75      0.02     0.75
parent.frame        0.02      0.75      0.02     0.75
sys.function        0.02      0.75      0.02     0.75
mat.or.vec          0.02      0.75      0.00     0.00
odbcFetchRows       0.02      0.75      0.00     0.00
odbcUpdate          0.02      0.75      0.00     0.00
sqlGetResults       0.02      0.75      0.00     0.00
sqlSave             0.02      0.75      0.00     0.00
sqlwrite            0.02      0.75      0.00     0.00

$sample.interval
[1] 0.02

$sampling.time
[1] 2.68

Просмотр вывода summaryRprofsкажется, что [.data.frame занимает больше всего времени.Я не вижу, как обойти это, хотя.

1 Ответ

1 голос
/ 15 февраля 2012

Как отмечается в комментариях Винсента, корреляция вычислений (Пирсона) сама по себе довольно быстрая.После того, как вы исчерпали базовые трюки R-профилирования и ускорения, вы всегда можете пойти

  • многоядерными и / или параллельными через соответствующие пакеты R

  • useскомпилированный код, и я могу придумать пакет, способствующий тому, чтобы

  • даже рассматривал графические процессоры как, например, мое вступление к высокопроизводительным вычислениям со слайдами R (на странице презентаций ) содержит пример вычисления (более дорогой Кендалла) корреляции для большого усиления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...