モデルのライブラリからアンサンブルを選択するためのカルアナらの方法を複製しようとしています(pdf)。この方法の中核となるのは、モデルをアンサンブルに追加するための欲張りアルゴリズムです(モデルは複数回追加できます)。この欲張り最適化アルゴリズムの実装を作成しましたが、非常に低速です。
library(compiler)
set.seed(42)
X <- matrix(runif(100000*10), ncol=10)
Y <- rnorm(100000)
greedOpt <- cmpfun(function(X, Y, iter=100){
weights <- rep(0, ncol(X))
while(sum(weights) < iter) {
errors <- sapply(1:ncol(X), function(y){
newweights <- weights
newweights[y] <- newweights[y] + 1
pred <- X %*% (newweights)/sum(newweights)
error <- Y - pred
sqrt(mean(error^2))
})
update <- which.min(errors)
weights[update] <- weights[update]+1
}
return(weights/sum(weights))
})
system.time(a <- greedOpt(X,Y))
Rがループをうまく実行しないことは知っていますが、ループなしでこのタイプの段階的検索を実行する方法は考えられません。
この機能を改善するための提案はありますか?