【问题标题】:root minuit2 contours with parameter limits具有参数限制的根 minuit2 轮廓
【发布时间】:2012-07-25 08:25:35
【问题描述】:

我正在尝试使用作为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 上问过这个问题,但我认为可能还有一些堆栈溢出用户已经处理过这个或类似的问题。

【问题讨论】:

    标签: python data-analysis minimization root-framework


    【解决方案1】:

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

    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 文件。

    【讨论】:

    • 不可能不引发异常。参数限制代表物理界限,不可能在这些限制之外评估 chi^2。我试过像你建议的那样简单地返回一个大数字,但是 Minuit 在比我给出的简单示例更复杂的情况下死亡;例如,尝试f(x,y,z) 并仅对xy 设置限制。我不明白为什么 Minuit 不应该尊重我设定的限制。它们是我的功能未定义的物理限制。
    • 当使用参数限制运行Minuit.migrad() 时,Minuit 执行Minuit user guide 的第 1.3.1 节中描述的参数转换。我假设 Minuit.contour() 在没有参数转换的情况下运行(你必须查看代码或找到 CONTOUR 实现的描述),并且在复杂情况下你无法从 Minuit 获取轮廓。
    • 也许您可以使用其他一些软件包,例如[lmfit-py](newville.github.com/lmfit-py] 或通过在(x,y) 点的网格上评估您的成本函数来自己计算轮廓,或者在(x,y) 点的网格上运行Minuit.migrad() 固定xy 如果你有更多的参数,然后使用例如matplotlib来计算轮廓?当然这很慢,但是由于你自己做更多的实际工作,你有更多的控制权,可以让它在复杂的情况下工作。我可以提供一个代码sn- p 如果这个建议听起来很神秘。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2023-03-22
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多