Różnica między algorytmem Levenberga-Marquardta i ODR

Udało mi się dopasować krzywe do zbioru danych x / y za pomocąszczyt-o-mat, jak pokazano niżej. To liniowe tło i 10 krzywych lorentzyjskich.

Ponieważ muszę dopasować wiele podobnych krzywych, napisałem skryptową procedurę dopasowania, używającmpfit.py, który jest algorytmem Levenberga-Marquardta. Dopasowanie trwa jednak dłużej i, moim zdaniem, jest mniej dokładne niż wynik szczyt-o-mata:

Wartości początkowe

Wynik dopasowania ze stałym liniowym tłem (wartości tła liniowego pobrane z wyniku piku-o-maty)

Dopasuj wynik ze wszystkimi zmiennymi za darmo

Uważam, że wartości początkowe są już bardzo blisko, ale nawet przy stałym tle liniowym lewy lorentzian jest wyraźnie degradacją dopasowania.

Wynik jest jeszcze gorszy dla całkowitego swobodnego dopasowania.

Wygląda na to, że Peak-o-matscipy.odr.odrpack. Co jest bardziej prawdopodobne:

Zrobiłem błąd w implementacji?odrpack jest bardziej odpowiedni dla tego konkretnego problemu?

Dopasowanie do prostszego problemu (dane liniowe z jednym pikiem w środku) pokazuje bardzo dobrą korelację między szczytem o-mat a moim skryptem. Nie znalazłem też wiele o ordpack.

Edytować: Wydaje mi się, że mogłem sam odpowiedzieć na pytanie, jednak odpowiedź jest nieco niepokojąca. Użycie scipy.odr (co pozwala na dopasowanie metodą odr lub leastsq) daje wynik jako peak-o-mat, nawet bez ograniczeń.

Poniższy obraz pokazuje ponownie dane, wartości początkowe (prawie idealne), a następnie pasuje odr i leastsq. Krzywe komponentów są dla krzywej odr

Przejdę na odr, ale to wciąż mnie denerwuje. Metody (mpfit.py, scipy.optimize.leastsq, scipy.odr w trybie leastsq) „powinny” dawać takie same wyniki.

A dla ludzi, którzy natknęli się na ten post: aby wykonać dopasowanie odr, należy podać błąd dla wartości x i y. Jeśli nie ma błędu, użyj małych wartości z sx << sy.

linear = odr.Model(f)
mydata = odr.RealData(x, y, sx = 1e-99, sy = 0.01)
myodr = odr.ODR(mydata, linear, beta0 = beta0, maxit = 2000)
myoutput1 = myodr.run() 

questionAnswers(1)

yourAnswerToTheQuestion