具有参数限制的根-分钟2等高线

2024-10-03 21:30:41 发布

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

我正在尝试使用Minuit2 minimizer为具有物理限制的参数生成等高线图,它是ROOT数据分析框架的一部分。不幸的是,当我试图绘制等高线图时,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上问过这个问题,但是我想可能还有一些堆栈溢出用户处理过这个或类似的问题。在


Tags: in框架区域参数stdinlineexception物理
1条回答
网友
1楼 · 发布于 2024-10-03 21:30:41

试试你的例子,不要提出例外

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),再回到{}。在

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

^{pr2}$

这确实会将优化器抛出禁止的区域,但并不妨碍它有时对它们进行探测(即在那里求值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文件。在

相关问题 更多 >