3

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 フォーラムでこの質問をしましたが、これまたは同様の問題に対処したスタック オーバーフロー ユーザーもいるかもしれないと思いました。

4

1 に答える 1

0

例外を発生させずに例を試してください

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

合理的な xy 等高線ポイントが得られます (つまり、真の等高線の 1e-3 以内)。

sigmas=3輪郭呼び出しのパラメーターは、輪郭が計算され、パラメーター制限に沿った輪郭点が計算されることをm.contour('x', 'y', 3)意味することに注意してください。sigmas ** 2 == 9私が見る限り、これはcontour() pyminuitのドキュメントには記載されていません)。あなたの例では、輪郭は から始まり、(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

Minuit (および Minuit2) で使用される輪郭アルゴリズムの簡単な説明と、 ROOT の Minuit2 コードのドキュメントを次に示します。実装を示す実際の C ファイルを見つけることができませんでした。

于 2012-07-27T10:23:37.050 に答える