Подгонка ортогональной регрессии в scipy методом наименьших квадратов

Метод leastsq в scipy lib подгоняет кривую к некоторым данным. И этот метод предполагает, что в этих данных значения Y зависят от некоторого аргумента X. И вычисляет минимальное расстояние между кривой и точкой данных по оси Y (dy)

Но что если мне нужно вычислить минимальное расстояние по обеим осям (dy и dx)

Есть ли способы реализовать это вычисление?

Вот пример кода при использовании вычисления по одной оси:

import numpy as np
from scipy.optimize import leastsq

xData = [some data...]
yData = [some data...]

def mFunc(p, x, y):
    return y - (p[0]*x**p[1])  # is takes into account only y axis

plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData))
print plsq

Я недавно попробовал библиотеку scipy.odr и она возвращает правильные результаты только для линейной функции. Для других функций, таких как y=a*x^b, она возвращает неправильные результаты. Вот как я ее использую:

def f(p, x):      
    return p[0]*x**p[1]

myModel = Model(f)
myData = Data(xData, yData)
myOdr = ODR(myData, myModel , beta0=[1,1])
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq
out = myOdr.run()
out.pprint()

Это возвращает неправильные результаты, не желаемые, а в некоторых входных данных даже не близкие к реальным. Может быть, есть какие-то особые способы его использования, что я делаю не так?

13
задан Vladimir 24 February 2012 в 04:25
поделиться