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