2016-12-20 92 views
1

我有兴趣找到模型的优化参数(通过用已知值最小化模型的输出)。我感兴趣的参数有一定的界限,它们也受到看起来像1 - sum(x_par) >= 0的不等式的限制,其中x_par是总参数列表中的一些参数的列表。我已经使用scipy.optimize.minimize以不同的方法(如COBYLASLSQP)尽量减少这个问题,但这个功能的拟合性能很差,错误一般在50%以上。替代scipy.optimize.minimize约束优化?

我注意到scipy.optimize.curve_fitscipy.optimize.differential_evolution在拟合给定值方面效果很好,但这些函数不允许对参数进行约束。我正在寻找python中的替代方案来优化我的问题,该问题允许约束参数,并且可以在拟合给定的曲线/值方面比scipy.optimize.minimize做得更好。

回答

1

您可能会感兴趣lmfit有用。这个模块是围绕许多scipy.optimized例程(包括leastsq,differential_evolution,大部分缩放最小化)的一个包装,用所有变量替换所有变量,这些对象可以是固定的或者是自由的,有界限的,或者被限制为数学表达式其他参数,全部独立于解决最小化问题的方法。还有一个支持许多曲线拟合问题的类,并支持改进的参数置信区间分析。

在谨慎的情况下,可以应用不平等约束,如在 http://lmfit.github.io/lmfit-py/constraints.html#using-inequality-constraints中简要讨论的那样。

+0

我很好奇,如果方式参数被定义(使用一个对象)使得这个软件包不适合需要优化大量参数的问题吗?例如,我会事先知道该问题需要优化多少个参数,但由于大量参数的复杂性,我无法通过一个对象指定每个参数的“定义”。在这方面,'scipy.optimize.minimize'是灵活的,因为输入参数可以扩展为'x1,.. xn = x [0],... x [n]' – Pupil

+0

因为lmfit包装了scipy.optimize。最小化,它应该能够处理类似的复杂问题。 Lmfit将参数保存在有序字典中,以便您不必为索引指定含义。这可能看起来像一个小好处,但它允许用户方便地将任何参数从变化变为固定,而不必重写目标函数。但如果你想,你可以命名参数“1”,“2”,.....;) –

+0

嗨...我怎么能实现约束'1 - sum(x_par)> = 0'?我不知道如何通过表达式来计算总和函数,这是您提供的链接中建议的会计不平等约束的一般方式。谢谢。 – Pupil