Я пытаюсь использовать команду DEoptim (из одноименного пакета R), чтобы свести к минимуму функцию, но я получаю эту странную ошибку. разной длины, чем матрица параметров. «Я ничего не могу найти об этой проблеме, кроме некоторого опубликованного кода на C, который я не могу прочитать.Ошибка в DEoptim: результат объектной функции имеет разную длину, чем матрица параметров
Ошибка возникает, когда я пытаюсь передать дополнительные параметры функции через аргумент ...
. В следующем примере я изменяю функцию Rosenbrock (взятую из документации DEoptim), чтобы иметь второй аргумент pow
(который я установил равным 2, так что пример идентичен документированному). Это работает. Затем я пытаюсь сделать то же самое с функцией Растригина (из документации GenSA). Тот же трюк здесь не работает (но оптимизатор отлично работает, если я жестко задаю свой второй аргумент, как в документированном случае).
Вот пример кода:
library(DEoptim)
## Note that the vector of parameters to be optimized must be the first
## argument of the objective function passed to DEoptim.
Rosenbrock <- function(x,pow){
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^pow + (1 - x1)^pow
}
lower <- c(-10,-10)
upper <- -lower
set.seed(1234)
# works
DEoptim(Rosenbrock,pow=2, lower, upper)
Rastrigin <- function(x) {
sum(x^2 - 10 * cos(2 * pi * x)) + 10 * length(x)
}
Rastrigin2 <- function(x,p) {
sum(x^2 - p * cos(2 * pi * x)) + 10 * length(x)
}
dimension <- 2
lower <- rep(-5.12, dimension)
upper <- rep(5.12, dimension)
# works
DEoptim(fn=Rastrigin,lower=lower,upper=upper,
control = list(storepopfrom = 1))
# should be same, but doesn't work
DEoptim(fn=Rastrigin2,p=10,lower=lower,upper=upper,
control = list(storepopfrom = 1))
Естественно, эта проблема придумать более сложный пример, но я надеюсь, что объяснение на этом простом случае может помочь мне. Если это дополнительная помощь, конечной целью является вызов функции из объекта data.table
, где первый аргумент функции является (скалярным) параметром, который должен быть сведен к минимуму, а остальные аргументы - данными, взятыми из data.table
.
Это потрясающе, и это действительно удача, что я использовал «p» в качестве аргумента в MWE (так как это также имя аргумента в моей реальной цели). Благодаря! – Scott