#python #scipy #linear-regression #data-fitting
#python #scipy #линейная регрессия #подгонка данных
Вопрос:
Я пытаюсь выполнить линейную подгонку набора мер, как определено ниже:
def leastsq_lin_fit(x,y,yerr=[]):
fit_func = lambda p, x: p[0] * x p[1]
model=scipy.odr.Model(fit_func)
if len(yerr)>0: data = scipy.odr.RealData(x, y, sy=yerr)
else: data = scipy.odr.RealData(x, y)
odr = scipy.odr.ODR(data, model, beta0=[0., 1.])
out = odr.run()
a=out.beta[0]
aErr=out.sd_beta[0]
b=out.beta[1]
bErr=out.sd_beta[1]
но я заметил, что когда я анализирую yerr для процедуры подгонки, я получаю странный результат, как показано ниже:
в то время как, когда я подгоняю без учета полосы ошибок моих значений y, я получаю:
Я не говорю, что первый результат неверен, я подозреваю, что этот результат обусловлен тем фактом, что полосы ошибок в моих данных, вероятно, слишком малы, чтобы соответствовать значимой строке (в частности, для небольших значений X). Я хотел бы понять, поскольку это данные, с которыми мне приходится работать, как я могу улучшить эту подгонку (с учетом полос ошибок), чтобы сделать ее более надежной. Как бы вы применили такое распределение к линейной функции?
Здесь вы можете загрузить файл, содержащий данные, которые я использовал для создания этих графиков, и которые могут быть загружены через:
with open('test.np', 'rb') as f:
xdata = np.load(f)
ydata = np.load(f)
yerr = np.load(f)
(Если есть лучший способ загрузить файл, пожалуйста, дайте мне знать).
Комментарии:
1. Почему вы используете здесь ODR вместо стандартной линейной регрессии?
2. вероятно, потому, что я «невежественный», я смотрю онлайн, например, и они использовали его. Что вы подразумеваете под «стандартной линейной регрессией»?
3. Разница между ODR и классической регрессией наименьших квадратов имеет хорошее объяснение здесь: blog.rtwilson.com/orthogonal-distance-regression-in-python