我使用两种方法来优化系数:使用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
1条答案
按热度按时间bbuxkriu1#
扩展我的评论:你只描述了你的数据,但没有显示它们。这里是一个虚构的例子。我使用了一个不同的差分进化(DE)实现,
DEopt
从包NMOF
(我维护)。我创建一个随机的
X
矩阵(对应于你的landsat_values
)。字符串
我预先计算
x
的幂,因为它们在整个优化过程中是固定的。现在我创建“true”参数true.p
,看看DEopt
和optim
是否可以恢复它们。y
对应于CCI
数据。型
你的目标函数,以矩阵形式重写(因为
X
现在拥有预先计算的幂):型
运行DE:
型
实际上是零。
我们恢复了真实参数:
型
现在使用
optim
(在本例中为无约束):我们也恢复了参数。所以,对于我的数据,这两个函数似乎都能够处理模型。