如何使用 Optim.jl 优化函数求和

How to use Optim.jl optimize function with a summation

我目前正在进行一个研究项目,我需要找到 $\beta$ 的正确值,使函数 $\sum_i (p_i-\avg(n_c)_i)^2$ 最小化。在这里,$\avg(n_c)_i$ 是一个数组,它是我试图匹配 $p_i$ 的函数。 $p_i$ 依赖于 $\beta$ 但也有一些其他依赖性,例如 $\chi^2=\sum_i p_i=N$ 其中 $N$ 是系统中的粒子数。

所以本质上,我正在尝试 运行 我的代码采用起始 $\beta$ 值,求解 $p_i$ 使其符合求和条件,并检查是否 $\chi^2$ 被最小化。从那里,我想将 $\beta$ 更新为一个新值,直到达到合理的截止值。

这是我开始尝试在 optim.jl 中实现优化功能的地方。我已经 运行 通过一些示例和测试,但我似乎无法让它工作。主要问题是所有计算 $p_i$ 的函数都依赖于其他变量。具体来说,我的函数称为 pcalc(β,μ,E,cutoff)。如您所见,我无法真正将其转换为类似于 Optim.jl 文档中示例的格式。我想把它写成 pcalc(P,β) 就像文档中那样,但它确实不可行。

目前,我有一种 hessian 类型的求解器,但 运行 花费的时间太长,这就是我希望实现 Optim.jl.

的原因

任何建议或帮助将不胜感激,否则,我可能不得不编写自己的优化器函数。

我不得不承认我在解决你的问题时遇到了一些困难,但它的要点似乎是你有一个函数 pcalc(β,μ,E,cutoff) 你想针对 β 进行优化,并且正在努力以一种允许您将其传递给需要单个输入的 optimize 的方式编写它。

手册中的 tips and tricks 部分对此进行了处理:本质上,您为 optimize 定义了一个匿名函数或闭包,即您这样做

optimize(x -> pcalc(x, μ, E, cutoff), ...)

我不明白求和部分是如何得出的,但是如果你说 pcalc 的解决方案有一个额外的约束,它说 β 的解决方案应该添加到一些值,您可能想查看具有特殊约束语法的 JuMP,例如参见here 举个例子。或者,您可以通过执行

之类的操作在 Optim 中进行破解
optimize(x -> pcalc(x, μ, E, cutoff) + 1e6 * (sum(x) - 1.0)^2, ...)

即只需在 objective 函数中添加一个惩罚项即可。

这也是 LsqFit.jl 的一个很好的应用程序,它可以精确求解元素可能相互关联的平方和,就像您的情况一样。我发现它在我还想为 beta 施加界限的“广义矩法”问题中很有用。 (替代方案是 Optim.jlFminBox,但我发现它非常慢。)

https://github.com/JuliaNLSolvers/LsqFit.jl

Optim.jl 类似,您想要定义一个同时接受 beta 和您的数据的函数,以便 MYFUNCTION(ALLDATA, beta) returns 一个向量,其中 i'the 元素是 p_i-\avg(n_c)_i。然后调用

fit = curve_fit(MYFUNCTION, ALLDATA, zeros(N), beta0)

您是否需要估计 p_i 所依赖的其他参数?然后将它们与 beta 一起添加到第二个参数中(在向量中)。