我试图估计几个ODE系统的参数,以适应相同的数据集。当我用估计的参数绘制一些模型的变量时,曲线与真实数据集非常吻合。然而,这只是一种视觉欣赏。我想用Julia 的Optim包中的优化结果来证明最佳候选模型(ODE系统(的选择是合理的
为了估计模型的参数,我使用了以下代码:
prob = ODEProblem(model,u_0,tspan,params);
cost_functionEP = build_loss_objective(prob,Tsit5(),L2Loss(sub_t_norm,sub_norm_data),prob_generator = problemEP, maxiters=1000000,verbose = false, save_idxs = [1,4,12] )
result_estimEP = Optim.optimize(cost_functionEP,lower,upper, params, Fminbox(BFGS()))
优化的输出,result_estimEP为:
* Status: success
* Candidate solution
Final objective value: 2.830272e+05
* Found with
Algorithm: Fminbox with BFGS
* Convergence measures
|x - x'| = 2.17e-19 ≰ 0.0e+00
|x - x'|/|x'| = 1.30e-21 ≰ 0.0e+00
|f(x) - f(x')| = 0.00e+00 ≤ 0.0e+00
|f(x) - f(x')|/|f(x')| = 0.00e+00 ≤ 0.0e+00
|g(x)| = 2.12e+07 ≰ 1.0e-08
* Work counters
Seconds run: 26 (vs limit Inf)
Iterations: 6
f(x) calls: 10034
∇f(x) calls: 10034
我阅读了Optim的在线文档,以了解输出的每一行都意味着什么,但没有太多信息(仅用于单变量估计(。能请比我更熟悉优化问题的人指出这些值的含义吗?
一些可能有帮助的评论:
* Status: success # the optimization was successful
* Candidate solution
Final objective value: 2.830272e+05 # the loss function value at the end
* Found with
Algorithm: Fminbox with BFGS # the algorithm used
* Convergence measures
|x - x'| = 2.17e-19 ≰ 0.0e+00 # the conditions
|x - x'|/|x'| = 1.30e-21 ≰ 0.0e+00 # that were satisfied
|f(x) - f(x')| = 0.00e+00 ≤ 0.0e+00 # or not. These are
|f(x) - f(x')|/|f(x')| = 0.00e+00 ≤ 0.0e+00 # odd though, see comment.
|g(x)| = 2.12e+07 ≰ 1.0e-08
* Work counters
Seconds run: 26 (vs limit Inf)
Iterations: 6
f(x) calls: 10034 # number of loss function calls
∇f(x) calls: 10034 # number of gradient of loss function calls
对我来说,你满足的唯一条件基本上是f(x) == f(x')
,这似乎很奇怪,这表明将x
更改为x'
不会影响损失函数,尽管梯度g(x)
不为零。也许丢失功能有问题?也可能这是典型的BFGS算法?我不确定。然而,令人放心的是,梯度并不是太,远远不能满足条件(小于1.0e-8(,所以也许你已经有了一个很好的最小化器。