2012-07-26 3 views
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 

누군가 다른 사람이 또는 유사한 문제를 다루었 다 : 불행하게도, Minuit2 내가 윤곽 플롯을 생성 할 때 한계 이외의 지역으로 매개 변수를 표류에 대한 의도를 보인다? 해결 방법이 있습니까?

나는이 질문을 이미 ROOT forums에 요청했지만이 문제 나 비슷한 문제를 처리 한 스택 오버플로 사용자가있을 수도 있다고 생각했습니다.

답변

0

예외

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

를 제기하지 않고 예를 시도하고 당신은 (즉, 1E-3의 진정한 윤곽 내에서) 합리적인 XY의 윤곽 점을 얻을 것이다.

형상 호출 의 매개 변수 m.contour('x', 'y', 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 

를 통해 사용자가 설정 한 한계를 존중해야하는 이유

는 내가 구현을 보여주는 실제 C 파일을 찾을 수 못했고, 여기에 짧은 description of the contour algorithm used by Minuit (and Minuit2)을 그리고 여기에 documentation for the Minuit2 code in ROOT을 알고하지 않습니다.

+0

단순히 예외를 발생시키지 않을 수 없습니다. 매개 변수 한계는 물리적 경계를 나타내며이 한계를 벗어나는 chi^2를 평가할 수 없습니다. 나는 당신이 제안한 것처럼 큰 숫자를 단순히 반환하려고 시도했지만 Minuit는 내가 준 간단한 예제보다 더 복잡한 시나리오에서 죽습니다. 예를 들어,'f (x, y, z)'를 시도하고'x'와'y'에 한계를 설정 만합니다. Minuit *가 내가 설정 한 한계를 존중해서는 안되는 이유를 이해할 수 없습니다. 내 기능이 정의되지 않은 물리적 한계입니다. – user545424

+0

Minuit.migrad()를 매개 변수 한계와 함께 실행하면 Minuit는 [Minuit 사용자 안내서] (http://seal.web.cern.ch/seal/documents/minuit)의 1.3.1 절에 설명 된 매개 변수 변환을 수행합니다 /mnusersguide.pdf). 'Minuit.contour()'가 매개 변수 변환없이 실행된다고 가정합니다 (코드를 보거나 CONTOUR 구현에 대한 설명을 찾으려면 복잡한 경우 Minuit에서 윤곽을 가져올 방법이 없습니다) . – Christoph

+0

예를 들어 다른 패키지를 사용할 수 있습니다. [lmfit-py] (http://newville.github.com/lmfit-py) 또는'(x, y)'점의 그리드에서 비용 함수를 계산하거나 Minuit.migrad를 실행하여 등고선을 계산하십시오)''(x, y)'그리드에서 더 많은 매개 변수를 갖고있는 경우'x'와'y'를 고정시킨 다음 예를 들어 matplotlib를 사용하여 등고선을 계산합니까? 물론 이것은 느리지 만 실제 작업을 더 많이 수행하기 때문에 더 많은 제어가 가능하며 복잡한 경우에도 작동 할 수 있습니다. 이 제안이 이상하게 들릴 경우 코드 스 니펫을 제공 할 수 있습니다. – Christoph