Ошибка DEoptim: результат целевой функции имеет длину, отличную от матрицы параметров
Я пытаюсь использовать команду DEoptim (из пакета R с тем же именем), чтобы минимизировать функцию, но получаю эту странную ошибку "результат целевой функции имеет длину, отличную от матрицы параметров". Я ничего не могу найти по этому поводу проблема, кроме некоторого опубликованного кода C, который я не могу прочитать.
Ошибка появляется, когда я пытаюсь передать дополнительные параметры функции через ...
аргумент. В следующем примере я изменяю функцию Rosenbrock (взятую из документации DEoptim), чтобы иметь второй аргумент pow
(который я установил на 2, так что пример идентичен задокументированному). Это работает. Затем я пытаюсь сделать то же самое с функцией Rastrigin (из документации 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
,
1 ответ
Я должен был бы заглянуть глубже по причине, но похоже, что ваш p
Аргумент частично совпадает с другим аргументом где-то в процессе оптимизации / оценки. Обходной путь должен использовать другое имя для этого аргумента.
require(DEoptim)
Rastrigin2 <- function(x,p.) {
sum(x^2 - p. * cos(2 * pi * x)) + 10 * length(x)
}
lower <- rep(-5.12, 2)
upper <- -lower
de <- DEoptim(Rastrigin2, lower, upper, list(storepopfrom=1), p.=10)
Я отправлю отчет об ошибке. Спасибо за воспроизводимый пример!