R语言 DEOptim下限和上限值

uxh89sit  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(203)

我使用两种方法来优化系数:使用DEOptim的一般优化和使用Optim函数的局部优化。下面是最小化函数:

function(data, par){
  sum(
    (data$CCI - 
       (par[1]+par[2]*log10(data$Landsat) +
          par[3]*log10(data$Landsat)^2 +
          par[4]*log10(data$Landsat)^3 + 
          par[5]*log10(data$Landsat^4)))^2, na.rm=TRUE)
}

字符串
下面是我如何使用DEOptim函数:

global_optimization_buffer <- DEoptim(min.RSS, lower, upper, data = DATA_buffer, DEoptim.control(itermax = 10000))


我有点惊讶,因为我用局部优化方法得到了更好的结果。下面是我用局部优化方法得到的结果:[local_opti][1]
下面是我使用全局优化得到的结果:[global_opti][2]
我还注意到,当我把越来越低的值放在一个更小的范围时,我得到了更好的结果(上一张系数范围为btw-10 & 10的图像,这里是系数范围为btw-5 & 5的结果)。
知道增加迭代次数不会改变任何东西,我的问题是:有没有更好的方法来使用DEOptim库?我是否正确地使用了这个函数?我的数据集包含3500 x 2个值。前3500个值被用作“真值”,范围在-1到2.5之间,平均值为-0.07.数据集的第二部分用于一个名为OC 3的函数:

function(coeff, landsat_values) {
  log_chloa <- coeff[1] + coeff[2]*log10(landsat_values) +
    coeff[3]*log10(landsat_values)^2 +
    coeff[4]*log10(landsat_values)^3 +
    coeff[5]*log10(landsat_values)^4
  return(log_chloa)
}


这部分数据集的值在0.27到107之间,平均值为1.65 [1]:https://i.stack.imgur.com/2JGhv.png [2]:https://i.stack.imgur.com/wi3mi.png [3]:https://i.stack.imgur.com/C5N6K.png

bbuxkriu

bbuxkriu1#

扩展我的评论:你只描述了你的数据,但没有显示它们。这里是一个虚构的例子。我使用了一个不同的差分进化(DE)实现,DEopt从包NMOF(我维护)。
我创建一个随机的X矩阵(对应于你的landsat_values)。

n <- 3500
x <- rnorm(n)
X <- cbind(1, x, x*x, x*x*x, x*x*x*x)

字符串
我预先计算x的幂,因为它们在整个优化过程中是固定的。现在我创建“true”参数true.p,看看DEoptoptim是否可以恢复它们。y对应于CCI数据。

true.p <- rnorm(ncol(X))
## y <- rnorm(n, sd = 5)  ## random y
y <- X %*% true.p


你的目标函数,以矩阵形式重写(因为X现在拥有预先计算的幂):

mse <- function(p, y, X) {
    res <- y - (X %*% p)
    sum(res*res)/nrow(X)
}


运行DE:

library("NMOF")
sol <- DEopt(OF = mse,
             algo = list(nG = 200,
                         nP = 50,
                         min = rep(-10, ncol(X)),
                         max = rep( 10, ncol(X)),
                         minmaxConstr = TRUE),
             X = X,
             y = y)
sol$OFvalue
## [1] 1.542069e-13


实际上是零。
我们恢复了真实参数:

## returned parameter values
sol$xbest
##[1] -1.1973190  1.0711195  1.6913071 -0.8870736 -1.1728667
true.p
## [1] -1.1973190  1.0711191  1.6913067 -0.8870735 -1.1728667


现在使用optim(在本例中为无约束):

optim(rep(1, ncol(X)), fn = mse, X = X, y = y,
      control = list(maxit = 10000, reltol = 1e-12))
## $par
## [1] -1.1973165  1.0711397  1.6913174 -0.8870751 -1.1728689
## 
## $value
## [1] 4.222055e-10
## 
## $counts
## function gradient 
##     1574       NA 
## 
## $convergence
## [1] 0
## 
## $message
## NULL
##

我们也恢复了参数。所以,对于我的数据,这两个函数似乎都能够处理模型。

相关问题