Насколько я понимаю, Statsmodel WLS (взвешенный наименьший квадрат) и curve_fit (который использует наименьшие квадраты по умолчанию) должны обеспечивать один и тот же результат.
При использовании невзвешенных значений это имеет место (код ниже # 1) ). Однако, когда я использовал весовые коэффициенты, выходные значения становятся совершенно другими (код ниже # 2).
Почему это так?
_ # 1 невзвешенный
import numpy as np
import statsmodels.api as sm
import pandas as pd
from scipy.optimize import curve_fit
Y = [-5,2,3,4,5,6,7]
X = [1,2,3,4,5,6,7]
W = [1,1,1,1,1,1,1]
def equation_func (x, m, c):
return m * x + c
popt, pcov = curve_fit(equation_func,X, Y, p0=[-1.6, 1.28], sigma=[1 / w for w in W],
absolute_sigma=True)
curve_results = [equation_func(x, popt[0], popt[1]) for x in X]
wls_model = sm.WLS(Y,sm.add_constant(X), weights=W)
results = wls_model.fit()
print(results.params)
print([popt[1], popt[0]])
#WLS - [-3.42857143 1.64285714]
#Curve_fit - [-3.42857143, 1.64285714]
_ # 2 Взвешенный
Y = [-5,2,3,4,5,6,7]
X = [1,2,3,4,5,6,7]
W = [1,2,3,4,5,6,7]
def equation_func (x, m, c):
return m * x + c
popt, pcov = curve_fit(equation_func,X, Y, p0=[-1.6, 1.28], sigma=[1 / w for w in W],
absolute_sigma=True)
curve_results = [equation_func(x, popt[0], popt[1]) for x in X]
wls_model = sm.WLS(Y,sm.add_constant(X), weights=W)
results = wls_model.fit()
print(results.params)
print([popt[1], popt[0]])
#WLS - [-1.64285714 1.28571429]
#Curve_fit - [-0.5840336134466501, 1.0966386554667582]