R:对于大时间序列,是否存在快速近似相关库?

时间:2012-02-15 06:35:48

标签: r time-series

我正在尝试制作一个能够实时找到前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 个答案:

答案 0 :(得分:1)

正如文森特在评论中指出的那样,计算(皮尔森)的相关性本身就很快。一旦你用完了基本的R分析并加快了技巧,你总是可以去

    通过适当的R包
  • 多核和/或并行

  • 使用已编译的代码,我可以考虑一个方便的包

  • 甚至将GPU视为例如我使用R幻灯片进行高性能计算简介(在我的presentations page上)包含了计算(更昂贵的Kendall)相关性以获得大增益的示例