Ответ 1
scipy.optmize.curve_fit
использует стандартную нелинейную оптимизацию наименьших квадратов и, следовательно, только минимизирует отклонение в переменных ответа. Если вы хотите, чтобы ошибка в независимой переменной считалась, вы можете попробовать scipy.odr
, которая использует ортогональную дистанционную регрессию. Как видно из его названия, он минимизирует как независимые, так и зависимые переменные.
Взгляните на образец ниже. Параметр fit_type
определяет, выполняет ли scipy.odr
полную ODR (fit_type=0
) или оптимизацию наименьших квадратов (fit_type=2
).
ИЗМЕНИТЬ
Хотя пример работал, это не имело большого смысла, так как данные y были рассчитаны на шумные данные x, что приводило к неравномерно разнесенной независимой переменной. Я обновил образец, который теперь также показывает, как использовать RealData
, который позволяет указывать стандартную ошибку данных вместо весов.
from scipy.odr import ODR, Model, Data, RealData
import numpy as np
from pylab import *
def func(beta, x):
y = beta[0]+beta[1]*x+beta[2]*x**3
return y
#generate data
x = np.linspace(-3,2,100)
y = func([-2.3,7.0,-4.0], x)
# add some noise
x += np.random.normal(scale=0.3, size=100)
y += np.random.normal(scale=0.1, size=100)
data = RealData(x, y, 0.3, 0.1)
model = Model(func)
odr = ODR(data, model, [1,0,0])
odr.set_job(fit_type=2)
output = odr.run()
xn = np.linspace(-3,2,50)
yn = func(output.beta, xn)
hold(True)
plot(x,y,'ro')
plot(xn,yn,'k-',label='leastsq')
odr.set_job(fit_type=0)
output = odr.run()
yn = func(output.beta, xn)
plot(xn,yn,'g-',label='odr')
legend(loc=0)