2015-09-17 2 views
1

J'essaie d'utiliser la commande DEoptim (du paquet R du même nom) pour minimiser une fonction, mais j'obtiens cette erreur étrange "résultat de la fonction objectif a longueur différente de la matrice de paramètres. "Je ne trouve rien à propos de ce problème, autre que du code C affiché que je ne peux pas lire.Erreur DEoptim: résultat de la fonction objectif a une longueur différente de la matrice de paramètres

L'erreur se produit lorsque j'essaie de transmettre des paramètres supplémentaires à la fonction via l'argument .... Dans l'exemple suivant, je modifie la fonction Rosenbrock (tirée de la documentation DEoptim) pour avoir un deuxième argument pow (que j'ai mis à 2, de sorte que l'exemple soit identique à celui documenté). Cela marche. Ensuite, j'essaie de faire la même chose avec la fonction Rastrigin (à partir de la documentation GenSA). La même astuce échoue ici (mais l'optimiseur fonctionne bien si je code en dur dans mon second argument, comme dans le cas documenté).

Voici l'exemple de code:

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)) 

Naturellement, ce problème est venu dans un exemple plus compliqué, mais je suis en espérant qu'une explication sur cette affaire simple peut me aider. S'il s'agit d'une aide supplémentaire, le but ultime est d'appeler une fonction depuis un objet data.table, où le premier argument de la fonction est un paramètre (scalaire) à minimiser, et les arguments restants sont des données provenant du data.table.

Répondre

1

Je devrais chercher plus profondément la cause première, mais il semblerait que votre argument p corresponde partiellement à un autre argument quelque part dans le processus d'optimisation/évaluation. La solution consiste à utiliser un nom différent pour cet argument.

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) 

Je vais déposer un rapport de bogue. Merci pour l'exemple reproductible!

+0

C'est un peu étonnant, et c'est vraiment de la chance que j'ai utilisé "p" comme argument dans le MWE (car c'est aussi le nom d'un argument dans mon objectif réel). Merci! – Scott