【问题标题】:Julia - Equivalent of Python lmfitJulia - Python lmfit 的等价物
【发布时间】:2020-03-11 11:18:35
【问题描述】:

我想使用最小二乘法 (Levenberg-Marquardt) 在函数 f 中最小化 xy。在 Python 中,我可以使用lmfit,如下所示

params = lmfit.Parameters()
params.add('x', value=0, min=-np.pi, max=np.pi)
params.add('y', value=0.0, min=-0.25, max=0.25)
# Least square is the default method
x,y = lmfit.minimize(f, params)

在 Julia 中是否有任何等效/最好的方法来实现这一点?

【问题讨论】:

  • 我在下面更新了我的答案。

标签: python julia least-squares lmfit


【解决方案1】:

必须是 Levenberg-Marquardt 吗?如果没有,你可以使用Optim.jl得到你想要的:

using Optim

f(x) = x[1]^2 + x[2]^4
result = optimize(f, [1.0,2.0]) # minimum expected at (0,0)
x,y = result.minimizer # (2.3024075561537708e-5, -0.0009216015268974243)

lbounds = [1, -0.25]
ubounds = [2, 0.25]
result = optimize(f, lbounds, ubounds, [1.5,0.1]) # minimum expected at (1,0)
x,y = result.minimizer # (1.0000000000000002, -2.1978466115000986e-11)

上一个答案:

你也许可以使用包LsqFit.jl

using LsqFit

# function with two parameters
@. f(x, p) = p[1]*exp(-x*p[2])

# fake data
xdata = range(0, stop=10, length=20)
ydata = f(xdata, [1.0 2.0]) + 0.01*randn(length(xdata))

# upper and lower bounds + initial parameter guess
lb = [-π, -0.25]
ub = [π, 0.25]
p0 = [0.5, 0.1]

# least squares fit
fit_bounds = curve_fit(f, xdata, ydata, p0, lower=lb, upper=ub)
p1,p2 = fit_bounds.param

【讨论】:

  • 非常感谢!是否可以在optimize 中将另一个参数传递给f(这将是Vector),而不是最小化(常量Vector)?
  • 另外,f 函数能否返回一个ArrayThis 是我尝试在 Julia 中实现的 python 函数,它们似乎能够最小化一个 numpy 数组。
  • 是的,您可以将额外的参数传递给f。您可以为此使用闭包x->f(x,a),其中a 是要传递给f 的附加向量。
  • 关于你的第二个问题,函数residual也返回一个标量,AFAICS。
  • 谢谢,非常感谢!无论如何,很确定该函数中的residual 返回数组,因为frequency_sliceslice 对象。我也可以在 Julia 中为数组工作吗?
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
相关资源
最近更新 更多