负对数似然最小化的参数约束
Constrain on parameters for Negative Log Likelihood Minimization
我正在尝试拟合一个 5 参数(a、b、c、d、e)模型,其中一个参数受另一个参数的约束,比方说,
0< d < 1
e < |d|
我目前正在使用zfit which as far as I know, uses iMinuit
我只创建了 zfit.Parameters
并设置了限制,使它们可以访问的范围有效,再说一遍:
d = zfit.Parameter('d', value=0.5, lower_limit=0.3, upper_limit=1.0, step_size=0.01)
e = zfit.Parameter('e', value=0.1, lower_limit=0.0, upper_limit=0.3, step_size=0.01)
到目前为止效果很好,但我认为这不是正确的做法。
所以我的问题是,处理这种约束的正确方法是什么?
干杯
我会谨慎使用这个限制,因为它们会阻止变量,理想情况下,它们应该远离最终值。
有两种方法可以达到你想要的效果:
- 要么将“数学上”的约束强加为逻辑结果,那么使用组合参数(它是其他参数的函数)从另一个参数定义一个参数。如果可能,这应该是首选方式。
- 另一种选择是用附加条款施加这种限制。但是,当您修改可能性时,这可能会产生影响。最小化器会找到一个最小值,但这可能不是您要查找的最小值。您可以使用的是 SimpleConstraints 并在违反上述任何一项时为可能性添加惩罚项(例如
tf.cast(tf.greater(d, 1), tf.float64) * 100.
)。也许还要确保 minuit 是 运行 和 use_minuit_grad.
我正在尝试拟合一个 5 参数(a、b、c、d、e)模型,其中一个参数受另一个参数的约束,比方说,
0< d < 1
e < |d|
我目前正在使用zfit which as far as I know, uses iMinuit
我只创建了 zfit.Parameters
并设置了限制,使它们可以访问的范围有效,再说一遍:
d = zfit.Parameter('d', value=0.5, lower_limit=0.3, upper_limit=1.0, step_size=0.01)
e = zfit.Parameter('e', value=0.1, lower_limit=0.0, upper_limit=0.3, step_size=0.01)
到目前为止效果很好,但我认为这不是正确的做法。
所以我的问题是,处理这种约束的正确方法是什么?
干杯
我会谨慎使用这个限制,因为它们会阻止变量,理想情况下,它们应该远离最终值。
有两种方法可以达到你想要的效果:
- 要么将“数学上”的约束强加为逻辑结果,那么使用组合参数(它是其他参数的函数)从另一个参数定义一个参数。如果可能,这应该是首选方式。
- 另一种选择是用附加条款施加这种限制。但是,当您修改可能性时,这可能会产生影响。最小化器会找到一个最小值,但这可能不是您要查找的最小值。您可以使用的是 SimpleConstraints 并在违反上述任何一项时为可能性添加惩罚项(例如
tf.cast(tf.greater(d, 1), tf.float64) * 100.
)。也许还要确保 minuit 是 运行 和 use_minuit_grad.