不支持的目标函数返回值

时间:2012-11-09 12:41:14

标签: r optimization

这是我的代码:用DEoptim算法优化的函数;事实上,这个功能非常简单。

可重复的代码:

library(DEoptim)
library(sm)

tau.0 <- c(58.54620, 61.60164, 64.65708, 71.19507, 82.39836, 101.28953, 119.68789)
rate <- c(0.04594674, 0.01679026, 0.02706263, 0.04182605, 0.03753949, 0.04740187, 0.05235710)
Du <- c(4.27157210, -0.07481174, -0.10551229, 0.51753843, 1.51075420, 6.51483315, 7.35631500)
Co <- c(0.2364985, -6.2947479, -7.5422644, -1.2745887, -42.6203118, 55.7663196, 70.9541141)

h <- h.select(x = tau.0, y = rate, method = 'cv')
sm <- sm.regression(x = tau.0, y = rate, h = h)
ya <- sm$estimate
xa <- sm$eval.points
y <- approx(x = xa, y = ya, xout = tau.0, rule = 2)$y

besty <- function(x) {

    dtau.0 <- x
    xout <- seq(1, max(tau.0), dtau.0)
    ratem <- approx(x = tau.0, y = rate / 1, xout = xout)$y
    ym <- approx(x = tau.0, y = y / 1, xout = xout)$y
    Dum <- approx(x = tau.0, y = Du, xout = xout)$y
    Com <- approx(x = tau.0, y = Co, xout = xout)$y
    dy <- NULL

    for(i in 1:length(ym)) {

        dy[i] <- ratem[i] - ym[i-1]

    }

    dy[is.na(dy)] <- na.omit(dy)[1]
    Dum[is.na(Dum)] <- na.omit(Dum)[1]
    Com[is.na(Com)] <- na.omit(Com)[1]
    dP <- Dum * dy - .5 * Com * dy ^ 2
    xout.m <- xout / 12
    dcurve <- cbind(dP * 100, xout.m)
    PVBP <- dcurve[which(dP == max(dP)),1]
    Maty <- dcurve[which(dP == max(dP)),2]

    return(- PVBP / x)

}

DEoptim(fn = besty, lower = 1, upper = 120)

对我来说,最后一个命令返回

ERROR: unsupported objective function return value

我的代码有什么问题,好的DEoptim无法优化?

如果我替换最后一个函数的命令行

return(- PVBP / x)

return(as.numeric(- PVBP / x))

似乎DEoptim工作正常,直到几次迭代,然后......

> DEoptim(fn = besty, lower = 1, upper = 12)
Iteration: 1 bestvalit: -0.898391 bestmemit:    1.186242
Iteration: 2 bestvalit: -0.903304 bestmemit:    1.185117
Iteration: 3 bestvalit: -0.999273 bestmemit:    1.043355
Iteration: 4 bestvalit: -0.999273 bestmemit:    1.043355
Error in DEoptim(fn = besty, lower = 1, upper = 12) : 
  unsupported objective function return value

也许是函数语法中的东西?

谢谢,伙计们:)

2 个答案:

答案 0 :(得分:2)

我不知道你究竟想做什么,所以我不能给你一个确切的答案。但是,这里是找出错误的步骤。

  1. 将您的功能更改为:

    besty <- function(x) {
        cat(x, "\n")
        dtau.0 <- x
        xout <- seq(1, max(tau.0), dtau.0)
       <snip>
    
  2. 现在,当您运行优化器时:

    set.seed(1)
    DEoptim(fn = besty, lower = 1, upper = 120)
    

    你打印出传递的值:

    32.6 
    45.28 
    69.17
    .... 
    

    特别是,当值x = 8.353通过时,它会中断。

  3. 接下来,使用此特定值(即

    )逐步执行您的函数
    x = 8.353
    dtau.0 <- x
    xout <- seq(1, max(tau.0), dtau.0)
    ratem <- approx(x = tau.0, y = rate / 1, xout = xout)$y
    ym <- approx(x = tau.0, y = y / 1, xout = xout)$y
    Dum <- approx(x = tau.0, y = Du, xout = xout)$y
    Com <- approx(x = tau.0, y = Co, xout = xout)$y
    ....
    

    我不确切知道你在做什么,所以我不能告诉你什么是“错误的”。

答案 1 :(得分:0)

由于Aaron,Joshua Ulrich和csgillespie提示解决了。

为了使代码正常工作,需要进行两次修改:

...
PVBP <- dcurve[which(dP == max(dP)),1]
Maty <- dcurve[which(dP == max(dP)),2]
...

必须替换为

...
PVBP <- dcurve[which(dP == max(dP)),1][1]
Maty <- dcurve[which(dP == max(dP)),2][1]
...

,而

...
return(- PVBP / x)
...

必须替换为

...
return(as.numeric(- PVBP / x))
...

并且为了避免目标函数中的NA,需要将边界设置为

DEoptim(fn = besty, lower = 1, upper = max(tau.0) / 12)

谢谢帮帮我的人!