我试图拟合一个通过原点的线性回归模型。我曾尝试使用SciPy的curve_filt函数和Statsmodels的ols函数来实现这一点,但尽管它们具有相同的参数,但它们给出了不同的R2分数。我想知道为什么会出现这种情况,以及哪种方法最适合拟合通过原点的线性回归模型。以下是我尝试过的代码:
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from scipy.optimize import curve_fit
from sklearn.metrics import r2_score
# create sample data
x = np.linspace(0, 1, 100)
y = x**2 + np.random.normal(scale=0.1, size=100)
# fit linear model with no intercept using statsmodels
data = pd.DataFrame({'x': x, 'y': y})
model = smf.ols('y ~ x + 0', data=data)
results = model.fit()
r2_sm = results.rsquared
# fit linear model with no intercept using curve_fit
def lin_func(A, x):
return A*x
popt, pcov = curve_fit(lin_func, x, y)
y_fit = lin_func(x, *popt)
r2_scipy = r2_score(y, y_fit)
print("R-squared (statsmodels):", r2_sm)
print("R-squared (curve_fit):", r2_scipy)