Julian非线性最小二乘法包装中的Levenberg-Marquardt

时间:2019-05-15 21:33:24

标签: julia nonlinear-optimization

我有一个参数估计问题,可以通过非线性最小二乘法优化来解决。我有一个带有两个未知参数x[0]x[1]的分析模型。我有一个测量数据样本的向量,并用它来写cost function

function cost_function(x)
    measured = data_read()   # This is where I read my measured samples
    model = analytical_model(x)  # I calculate the values from my 
                                   analytical model method
    residual = abs.(measured - model)
    return residual
end

LsqFit package中 在具有Levenberg-Marquardt (LM)实现的Julia中,只有方法curve_fit接受model(此处为analytical_model()),xdata,{{1} },p,并将此函数传递给ydata优化器。 (即)LM成为残差。但是对我来说,我的model(xdata,p) - ydatameasured都是复数,这就是我必须返回model的原因。

我尝试过

abs.()

但是它需要我的import LsqFit result = LsqFit.levenberg_marquardt(cost_function, rand(2)) 的雅各布作为另一个论点。我不知道雅可比行列式,我想让我的优化器使用前向差逼近为我计算雅可比行列式。朱莉娅有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

以下调用应该有效:

LsqFit.lmfit(cost_function, [0.5, 0.5], Float64[])

(请告诉我它是否有效,[0.5, 0.5]是示例起点)

这里是一个例子:

julia> function cost_function(x)
           measured = [2:2:20;] .+ 0.5im
           model = [1:10;] .* x[1] .+ x[2] .* im
           residual = abs.(measured .- model)
           return residual
       end
cost_function (generic function with 1 method)

julia> LsqFit.lmfit(cost_function, [0.5, 0.5], Float64[])
LsqFit.LsqFitResult{Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,1}}([2.0, 0.5], [5.18665e-8, 5.36734e-8, 5.65567e-8, 6.03625e-8, 6.49286e-8, 7.01067e-8, 7.57714e-8, 8.18218e-8, 8.81784e-8, 9.47796e-8], [0.000658313 -0.00846345; 0.00131663 -0.00846342; … ; 0.00592487 -0.00846286; 0.00658318 -0.00846272], true, Float64[])

julia> LsqFit.lmfit(cost_function, [0.5, 0.5], Float64[], autodiff=:forward)
LsqFit.LsqFitResult{Array{Float64,1},Array{Float64,1},Array{Float64,2},Array{Float64,1}}([2.0, 0.5], [4.44089e-16, 8.88178e-16, 1.77636e-15, 1.77636e-15, 1.77636e-15, 3.55271e-15, 3.55271e-15, 3.55271e-15, 3.55271e-15, 3.55271e-15], [-1.0 -0.0; -2.0 -0.0; … ; -9.0 -0.0; -10.0 -0.0], true, Float64[])

,我们看到返回了正确的解决方案[2.0, 0.5]