繁体   English   中英

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

[英]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.jlFminBox但我发现这是非常缓慢的。)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM