Julia - Python lmfit 的等价替代方案

3

我希望使用最小二乘法(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中实现这一功能?如果有,最好的方法是什么?

1
我在下面更新了我的答案。 - carstenbauer
1个回答

2

它一定要使用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)? - Darren Christopher
另外,函数 f 能够返回一个 Array 吗?这个 是我尝试在 Julia 中实现的 Python 函数,它们似乎能够最小化一个 numpy 数组。 - Darren Christopher
是的,你可以向 f 传递额外的参数。你可以使用闭包来实现,x->f(x,a),其中 a 是要传递给 f 的附加向量。 - carstenbauer
关于您的第二个问题,根据我所看到的,函数residual也返回一个标量。 - carstenbauer
谢谢,非常感谢!不过我很确定该函数中的 residual 返回的是数组,因为 frequency_slice 是一个 slice 对象。我能否也让 Julia 中的数组正常工作? - Darren Christopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接