Я пытаюсь повторить метод Каруана и др. Для Ensemble selection from libraries of models (pdf). В основе метода лежит жадный алгоритм добавления моделей в ансамбль (модели могут быть добавлены более одного раза). Я написал реализацию этого жадного алгоритма оптимизации, но это очень медленно:Жадная оптимизация в R
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 не делает петлю хорошо, но я не могу думать о каком-либо способе сделать этот вид ступенчатого поиск без цикла.
Любые предложения по улучшению этой функции?
Являются ли 'max.members' и' iter' взаимозаменяемыми? Я не думаю, что это справедливо или полезно сравнить вашу функцию greedOpt с lm.fit, поскольку они делают совсем другие вещи. 'greedOpt' использует цикл, чтобы сделать что-то, возможно, 1000 раз, lm.fit этого не делает. – mnel
@mnel Да, я исправил свой код. Я согласен, 'lm.fit' не справедлив, но я чувствую, что это хорошая верхняя граница для лучшей производительности, которую я мог бы получить. – Zach
Вы успешно реализовали метод отбора ансамблей Каруаны? –