/ / root minuit2 контури с ограничения на параметрите - python, анализ на данни, минимизиране, коренна рамка

root minuit2 контури с ограничения на параметрите - python, анализ на данни, минимизиране, коренна рамка

Опитвам се да създам контурни графи за параметри с физически ограничения, като използвам Minuit2 минимизатора, който е част от 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

Някой друг се е занимавал с този или подобен проблем? Има ли някакви заобиколни решения?

Вече зададох този въпрос относно ФОРУМЪТ форуми, но мислех, че може да има и някои потребители на преливник, които са се занимавали с този или подобен проблем.

Отговори:

0 за отговор № 1

Изпробвайте примера си, без да повдигате изключение

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

и ще получите разумни xy контурни точки (т.е. в рамките на 1е-3 на истинския контур).

Имайте предвид, че параметърът sigmas=3 в контурното ви обаждане m.contour("x", "y", 3) означава, че контурът за sigmas ** 2 == 9 ще бъдат изчислени и ще бъдат изчислени контурните точки по параметъра. Доколкото мога да видя, това не се споменава в контур () 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) и тук е документация за кода Minuit2 в ROOT, Не успях да намеря действителния C файл, показващ изпълнението.