如何使用 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.jl
和 FminBox
,但我发现它非常慢。)
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
一起添加到第二个参数中(在向量中)。
我目前正在进行一个研究项目,我需要找到 $\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 举个例子。或者,您可以通过执行
optimize(x -> pcalc(x, μ, E, cutoff) + 1e6 * (sum(x) - 1.0)^2, ...)
即只需在 objective 函数中添加一个惩罚项即可。
这也是 LsqFit.jl 的一个很好的应用程序,它可以精确求解元素可能相互关联的平方和,就像您的情况一样。我发现它在我还想为 beta
施加界限的“广义矩法”问题中很有用。 (替代方案是 Optim.jl
和 FminBox
,但我发现它非常慢。)
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
一起添加到第二个参数中(在向量中)。