代码之家  ›  专栏  ›  技术社区  ›  JCV

为什么curve_fit和OLS给出不同的R2?

  •  0
  • JCV  · 技术社区  · 3 年前

    我试图拟合一个通过原点的线性回归模型。我曾尝试使用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)
    
    1 回复  |  直到 3 年前