4
我正在加快以下算法。我給函數一個xts時間序列,然後想要對前一個X點上的每個時間點進行一次主成分分析(我現在使用500個),然後使用該PCA的結果(5個主成分下面的代碼)來計算一些值。事情是這樣的:加速沒有Rcpp?
lookback <- 500
for(i in (lookback+1):nrow(x))
{
x.now <- x[(i-lookback):i]
x.prcomp <- prcomp(x.now)
ans[i] <- (some R code on x.prcomp)
}
我認爲這將需要我複製的回溯行作爲列,以便x
會像cbind(x,lag(x),lag(x,k=2),lag(x,k=3)...lag(x,k=lookback))
,然後運行每行prcomp
?儘管這看起來很昂貴。也許apply
的一些變種?我願意看看Rcpp,但是想在這之前讓你們看看。
編輯:謝謝所有的答覆。關於我的數據集/算法的信息:
- dim(x.xts)當前= 2000x24。但最終,如果這顯示承諾,它將不得不跑得快(我會給它多個數據集)。
- func(x.xts)需要約70秒。這是2000-500 prcomp調用與1500 500x24數據幀創作。
我試圖使用Rprof
,看看有什麼是算法中最昂貴的部分,但它使用Rprof
所以我需要用這個工具來獲得理解的結果(建議感謝)一些更多的經驗是我的第一次。
我想我會首先嚐試將其轉換爲_apply類型的循環,然後看看並行化。
沒錯,Xapply(X ='s,l,m,t':-))會有所幫助。只有一個想法:除非你現有的'for'循環需要大量的時間完成,否則不要麻煩。 –
當您剖析代碼時,需要花費多少時間?如果大部分時間都花在'prcomp'上,將循環移動到編譯代碼將無濟於事。你有沒有嘗試把循環放在一個函數中,並進行字節編譯? –
或者將函數doit(i,x){...}'寫成循環的內部部分,並使用'parallel :: mclapply((lookback + 1):nrow(x),doit,x)'並行評估(假設R-2.14和非Windows;如果數據不是太大而且你在Windows上,那麼'parallel :: parSapply'和一些額外的代碼可能會工作)。 –