Почему scipy curve_fit и statsmodel WLS дают разные результаты при взвешивании - PullRequest
0 голосов
/ 07 февраля 2020

Насколько я понимаю, 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]
...