用梯度下降法或遗传算法拟合公式的基本问题

2024-06-26 13:04:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试编写以下问题的代码。我已经根据一些参数定义了一个函数(在我的例子中,是布拉格镜和x射线束的参数)。现在,我试图将结果与使用相同公式的不同程序建模的结果进行比较,但似乎我的一些参数已关闭,因此结果aren't quite the same

如果我想找出正确的参数,我应该怎么做?我仅有的东西是公式f(x1,x2,…),我正在比较我的结果的实验曲线,以及一些关于参数应该是什么样子的想法(x1+-dx1,x2+-dx2,…)

我应该使用什么来最小化剩余?我知道Multifitting使用Levenberg–Marquardt algorithm,我读到过关于genetic algorythm或随机梯度下降的可能性(尽管据我所知,这些更常用于神经网络任务)。我在弄清楚应该编写什么以及如何编写代码方面遇到了一些困难:这个函数需要几分钟的时间来计算,所以遗传算法可能并不理想,我承认我没有弄清楚the SCG I know to be implemented in Python

你建议我在更简单的情况下使用什么?如果除了使用GA模块的算法外,还有其他算法需要在这里实现,是否有明确的masic解释?我问这个问题是在正确的地方吗?先谢谢你


Tags: the函数代码程序算法参数定义建模
2条回答

我同意sbjartmar提出的观点,但我怀疑有一个更简单的解释来解释这种差异,以及修复你所获得的贴合感的方法。我应该说,我不熟悉Multifitting软件,但我怀疑它正在做一些您不熟悉的事情,也应该尝试:

由于是在对数比例上打印,因此强调的是非常低的强度值。事实上,它非常适合高强度值,并且在低强度下会逐渐变差。这是可以理解的——高强度下的小失配比非常低强度下的大失配对总失配的贡献大得多

克服这一问题的一个好方法是适应日志空间。也就是说,让您的模型计算log(Intensity),并传入log(Intensity)的数据

这与用于解决问题的方法无关——它重新描述了要解决的问题。遗传算法在这里可能很有用,但如果Levenberg-Marquardt(速度会快得多)像你所展示的那样工作,它可能已经足够好了,或者至少值得继续使用。气体通常更能确保溶液不会卡在“局部最小值”中。到目前为止,还没有证据表明会发生这种情况(但这总是需要记住的)。我认为你所指的SGD方法是为了解决另一类问题

除了神经网络之外,我不熟悉遗传算法或SGD在其他领域的应用。但是,当y轴上的reflected energy的值低于10^-4时,拟合很难完成其工作。只有几个想法:

  1. 查看y < 10^-4值处的梯度发生的情况。当函数下降时,它会消失吗?它是否返回奇怪的值
  2. 检查lmfitscipy's优化器和安装程序(如果您还没有这样做)
  3. 检查函数下降或下降到小y值时是否返回NaN值

相关问题 更多 >