Julia 非线性最小二乘包中的 Levenberg-Marquardt
Levenberg-Marquardt in Julia Non-Linear Least Squares packages
我有一个参数估计问题,可以通过非线性最小二乘法优化来解决。我有一个包含两个未知参数 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
、p
, ydata
并将此函数传递给 LM
优化器。 (即)model(xdata,p) - ydata
成为残差。但对我来说,我的 measured
和 model
都是复数,这就是我必须 return 和 abs.()
的原因。
我试过了
import LsqFit
result = LsqFit.levenberg_marquardt(cost_function, rand(2))
但它需要我的 cost_function(x)
的 jacobian 作为另一个参数。我不知道雅可比行列式,我希望我的优化器使用前向差分近似为我计算雅可比行列式。有没有办法在 Julia 中做到这一点?
以下调用应该有效:
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]
。
我有一个参数估计问题,可以通过非线性最小二乘法优化来解决。我有一个包含两个未知参数 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
、p
, ydata
并将此函数传递给 LM
优化器。 (即)model(xdata,p) - ydata
成为残差。但对我来说,我的 measured
和 model
都是复数,这就是我必须 return 和 abs.()
的原因。
我试过了
import LsqFit
result = LsqFit.levenberg_marquardt(cost_function, rand(2))
但它需要我的 cost_function(x)
的 jacobian 作为另一个参数。我不知道雅可比行列式,我希望我的优化器使用前向差分近似为我计算雅可比行列式。有没有办法在 Julia 中做到这一点?
以下调用应该有效:
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]
。