![](/img/trans.png)
[英]Julia: Optimize a cost function with `Optim.jl` and `autodiff` for integers
[英]How to use Optim.jl optimize function with a summation
我目前正在从事一个研究项目,我需要找到$\\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$
更新$\\beta$
新值,直到达到合理的截止值。
这是我开始尝试在 optim.jl 中实现优化功能的地方。 我已经运行了一些示例和测试,但我似乎无法让它工作。 主要问题是所有计算$p_i$
的函数都依赖于其他变量。 具体来说,我的函数称为pcalc(β,μ,E,cutoff)
。 如您所见,我无法真正将其转换为类似于 Optim.jl 文档中的示例的格式。 我想把它写成pcalc(P,β)
就像文档中的那样,但这真的不可行。
目前,我有一种 hessian 类型的求解器,但运行时间太长,这就是我希望实现 Optim.jl 的原因。
任何建议或帮助将不胜感激,否则,我可能不得不编写自己的优化器函数。
我不得不承认我在关注你的问题时有点挣扎,但它的要点似乎是你有一个函数pcalc(β,μ,E,cutoff)
你想就β
优化它,并且正在挣扎以允许您将其传递给需要单个输入的optimize
的方式编写它。
手册中的提示和技巧部分对此进行了处理:本质上您定义了一个匿名函数或闭包来optimize
,即您这样做
optimize(x -> pcalc(x, μ, E, cutoff), ...)
我不明白求和部分是如何产生的,但是如果您说pcalc
的解决方案有一个额外的约束,即您的β
解决方案应该增加一些值,您可能需要查看具有特殊功能的 JuMP约束的语法,请参见例如此处的示例。 或者,您可以通过执行以下操作在 Optim 中破解此问题
optimize(x -> pcalc(x, μ, E, cutoff) + 1e6 * (sum(x) - 1.0)^2, ...)
即只是在您的目标函数中添加一个惩罚项。
这也是 LsqFit.jl 的一个很好的应用程序,它准确地解决了平方和,其中元素可能像您的情况一样相互关联。 我发现它在“广义矩方法”问题中很有用,我也想对beta
施加界限。 (另一种方法是Optim.jl
与FminBox
但我发现这是非常缓慢的。)
https://github.com/JuliaNLSolvers/LsqFit.jl
与Optim.jl
类似,您希望定义一个函数,该函数同时接受beta
和您的数据,以便MYFUNCTION(ALLDATA, beta)
返回一个向量,其中 i'the 元素是p_i-\\avg(n_c)_i
。 然后打电话
fit = curve_fit(MYFUNCTION, ALLDATA, zeros(N), beta0)
是否还有其他参数需要估计, p_i
取决于? 然后将它们与第二个参数中的beta
一起添加(在向量中)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.