我正在尝试使用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上问过这个问题,但是我想可能还有一些堆栈溢出用户处理过这个或类似的问题。在
试试你的例子,不要提出例外
您将得到合理的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()
应该严格遵守您通过设置的限制这是一个简短的description of the contour algorithm used by Minuit (and Minuit2),这是documentation for the Minuit2 code in ROOT,我没有找到显示实现的实际C文件。在
相关问题 更多 >
编程相关推荐