如何基于另一个参数将lmfit参数绑定为param1 <0.5 * param2

问题描述

我尝试遵循lmfit的{​​{3}}中给出的示例,并产生了以下内容

...
params.add(name="m",value=m_init,min=m_min,max=m_max)
params.add(name="mni_minus_m",value=1,vary=True,min=1e-12)
params.add(name="m_ni",expr='0.5*m + mni_minus_m')  # max value of m_ni is 0.5*m
...

这驻留在一个函数中,该函数采用m_maxm_min等参数。

您可能会说,我希望将m_ni的最大值设置为m值的一半,但是希望可以自由地在零(最好是最小值0.1)之间变化。以及最大数目出于类似float精度(?)的原因,在类似的问题中建议在中间参数中设置min=

不幸的是,看来这实际上只是将m_ni的值粘贴到m的50%上。对于我尝试与此匹配的所有事情,似乎都是这种情况。

这很可能发生,因为这是最小二乘决定要执行的操作,而这实际上是正确的语法,但是我不确定,并想向比我更胜任的任何人进行验证。

我还想知道在这种情况下如何为m_ni设置一个初始值,因为这对我来说还不是很清楚。

解决方法

我还没有使用过这个库,但是听起来像你想要的

       OLS       Lasso       Ridge
0   1.000000    0.914186    0.985494
1   0.700401    0.877555    0.867068

或者最后一个可能是

params.add(name="m",value=m_init,min=m_min,max=m_max)
params.add(name="mni_factor",min=0,max=0.5)
params.add(name="m_ni",expr='m * mni_factor')

获得0.1的下限,但是我不确定这是否对优化行为有效:)