当我改变间隔时,优化有奇怪的行为

时间:2014-05-22 14:18:36

标签: r loops intervals mathematical-optimization maximize

我在R中遇到optimize()的问题。

当我只更改optimize()中的间隔时,令人惊讶的是,最佳参数值会有很大变化。我之前发现了类似问题的帖子,但没有答案。

我从不同的时间间隔得到了不同的值:

c(-1,1): -0.819 

c(-1,2): -0.729 
c(0.3,0.99):0.818 
c(0.2,0.99):0.803 
c(0.1,0.99):0.23 
c(0,0.99):0.243 

我真的需要帮助解决这个问题,谢谢你们,如果你能提供帮助或者给我任何信息!

编辑:这是目标函数的图片:

enter image description here

我的代码如下:

dis<-data[,5]
vel<-data[,3]
condition<-data[,2]
nrow<-nrow(data)
number<-500
status<-0
counter<-rep(0,nrow)
firstvel<-rep(0,nrow)
secondvel<-rep(0,nrow)
j=1
n=1
l=0
secondpoint<-rep(0,nrow)
f<-function(a,b,p){ 
  for (i in 5:p){
    diss<-dis[1:(i-1)] 
    stddis<-sd(diss)    
    lowerdis<- a*stddis
    upperdis<- b*stddis
    if (status==0&&dis[i]>=upperdis){
      status<-1
      firstvel[j]<-vel[i]
      j=j+1    
    }
    else if (status==1&&condition[i]<=condition[i-1]&&dis[i]<lowerdis){
      status<-0
      secondvel[n]<-vel[i]
      n=n+1
    }
  }
  secondvel<- subset(secondvel, secondvel>0)
  firstvel<- subset(firstvel, firstvel>0)
  if (j==n&&j>1){
    for (k in 1:(j-1)){
      unit<-number/firstvel[k]
      number<-unit*secondvel[k]
    }
  }   else if(j>1) {
    for (k in 1:(j-2)){
      unit<-number/firstvel[k]
      number<-unit*secondvel[k]
    }
    unit<-number/firstvel[k+1]
    number<-unit*vel[p]
  }
  return(-number)
}
for (point in 300:nrow){
  diss<-dis[1:(point-1)]
  stddis<-sd(diss)
  upperdis<- stddis
  if (status==0&&dis[point]>=upperdis){
    status<-1
    firstvel[j]<-vel[point]
    j=j+1
    last<-optimize(f,c(0.2,0.99),b=1.0,p=point)
    secondpoint[n]<-last$minimum      ## This is the optimal value I need, which changes a lot 
    lowerdis<- secondpoint[n]*stddis
  }
  else if (status==1&&condition[point]<=condition[point-1]&&dis[point]<lowerdis){
    status=0
    secondvel[n]<-vel[point]
    n=n+1
  }
}
secondvel<-subset(secondvel,secondvel>0)
firstvel<-subset(firstvel,firstvel>0)
secondpoint<-as.numeric(secondpoint[1:(j-1)])
diff<-rep(0,(j-1))
if (j==n&&j>1){
  for (k in 1:(j-1)){
    unit<-number/firstvel[k]
    number<-unit*secondvel[k]
    diff[k]<-unit*(secondvel[k]-firstvel[k])
  }
}  else if(j>1) {
  for (k in 1:(j-2)){
    unit<-number/firstvel[k]
    number<-unit*secondvel[k]
    diff[k]<-unit*(secondvel[k]-firstvel[k])
  }
  unit<-number/firstvel[k+1]
  number<-unit*vel[nrow]
  diff[k+1]<-unit*(vel[nrow]-firstvel[k+1])
}

1 个答案:

答案 0 :(得分:1)

对于任何优化器(例如optimize())来说,这个优化问题基本上是不可能的,它假设目标函数是平滑的并且只有一个最小值。你没有给出一个可重复的例子,但是这里有一个与你的一样丑陋的客观函数的例子:

set.seed(101)
r <- runif(11)
f <- function(x) r[pmin(11,pmax(1,floor(x)+1))]

有许多随机全局优化算法 - 您可以在CRAN Optimization Task View搜索“全局”以查找更多 - 但它们都会慢得多,并且需要对优化控制参数进行大量调整,为任何特定问题获得可靠的结果。在这种情况下,来自"SANN"的{​​{1}}(模拟退火)方法与默认选项相当合适 - 它在25次中得到正确答案20。您可以调整控制参数(例如,增加optim():请参阅maxit),也许可以做得更好。

?optim

enter image description here

或者,对于一维问题,强力网格搜索始终是一个选项......