gpt4 book ai didi

python - 具有参数限制的 root minuit2 等高线

转载 作者:行者123 更新时间:2023-11-28 19:26:13 27 4
gpt4 key购买 nike

我正在尝试使用属于 ROOT 的 Minuit2 最小化器为具有物理限制的参数生成等高线图数据分析框架。不幸的是,当我尝试生成等高线图时,Minuit2 似乎有意将参数漂移到超出其限制的区域:

>>> from minuit2 import Minuit2
>>> def f(x,y):
... if x < 0 or y < 0:
... print 'x = %.2f, y = %.2f' % (x,y)
... raise Exception
... return x**2 + y**2
...
>>> m = Minuit2(f)
>>> m.limits['x'] = 0, 10
>>> m.limits['y'] = 0, 10
>>> m.migrad()
>>> xy = m.contour('x','y',3)
Info in <Minuit2>: MnMinos UP value has changed, need to update FunctionMinimum class
x = -9.95, y = 0.00
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in f
Exception

有没有其他人处理过这个或类似的问题?有任何解决方法吗?

我已经在 ROOT forums 上问过这个问题了,但我认为可能还有一些处理过此问题或类似问题的堆栈溢出用户。

最佳答案

在不引发异常的情况下尝试您的示例

def f(x,y):
return x ** 2 + y ** 2

您将获得合理的 xy 轮廓点(即在真实轮廓的 1e-3 范围内)。

请注意,轮廓调用 m.contour('x', 'y', 3) 中的参数 sigmas=3 表示 的轮廓将计算 sigmas ** 2 == 9 并计算沿参数限制的轮廓点。据我所知,这在 contour() pyminuit documentation 中没有提到。 ).在您的示例中,轮廓从 (0, 0) 开始,上升到 (3, 0),沿着圆圈到 (0, 3),然后返回到 (0, 0)

一种常见的方法是通过为排除的参数返回非常高的值来在成本函数中实现参数限制(任意形状,不仅是最小值/最大值):

def f(x,y):
if x < 0 or y < 0:
return 1e10
return x ** 2 + y ** 2

这确实会将优化器抛出禁区,但它不会阻止它有时探测它们(即在那里评估 f)。

我不知道为什么 contour() 应该严格遵守你设置的限制

m.limits['x'] = 0, 10
m.limits['y'] = 0, 10

这是一个简短的 description of the contour algorithm used by Minuit (and Minuit2)这是documentation for the Minuit2 code in ROOT , 我没能找到显示实现的实际 C 文件。

关于python - 具有参数限制的 root minuit2 等高线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11674574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com