【问题标题】:Get the slope and error of a weighted least square line using scipy curve_fit使用 scipy curve_fit 获取加权最小二乘线的斜率和误差
【发布时间】:2021-11-16 08:52:57
【问题描述】:
from scipy.optimize import curve_fit

def func(x, a, b):
    return a * x + b

x = [0, 1, 2, 3]
y = [160, 317, 3302, 16002]
yerr = [0.0791, 0.0562, 0.0174, 0.0079]

curve_fit(func, x, y, sigma=yerr)

我正在尝试使用 scipy 的 curve_fit 函数对上面的代码进行加权最小二乘线性回归。由此我需要得到斜率和拟合误差。我想我知道如何使用下面的代码获得斜率,但我不知道如何提取拟合误差。

# Code to get the slope (correct me if i'm wrong!!)
popt = curve_fit(func, x, y, sigma=yerr)
slope = popt[0]

谢谢!

========================================

编辑:我一直在做一些研究,我想我可能已经为自己弄清楚了一切。我会尽力解释的!

从下图中,我将这个函数提供给curve_fit,ab是我的参数,分别对应斜率和截距。

当您使用曲线拟合时,它会返回一个一维数组、popt 和一个二维数组 pcov。 popt 包含对我提供的参数的优化,所以在这种情况下,popt[0] 是斜率(绿色),popt[1] 是截距(红色)。

接下来,pcov 矩阵表示协方差。我在这里主要寻找的是对角线上的值,因为它们对应于每个参数的方差。我再次对它们进行了颜色编码,因此斜率错误为pcov[0,0](绿色),截距错误为pcov[1,1](红色)。

由此我能够得到我的线的斜率及其错误。我希望这个解释可以对其他人有所帮助!

【问题讨论】:

  • 那个代码是错误的。curve_fitreturns (popt, pcov) 所以你的popt[0] 将是curve_fits popt
  • 也就是说,需要指出的是,您不必要地使用非线性优化来进行简单的回归。
  • 那么更好的解决方案是什么?我的印象是我需要curve_fit,所以我可以在我的y值中包含错误。事实上我并不完全理解这个功能!

标签: python scipy linear-regression curve-fitting


【解决方案1】:

如cmets中所说:

curve_fit 是非线性拟合,绝对不需要进行线性回归。

如果使用,您的代码需要如下所示:

popt, pcov = curve_fit(func, x, y, sigma=yerr)
slope = popt[0]

也就是说,最好使用线性方法。一种方法是here,解释如下:

使用numpy.linalg.lstsq 最小化A x = b,其中背后的数学是使用( A x - b ).T ( A x - b ) 的最小化 加权问题是( A x - b ).T W ( A x - b ) W 是对角线,我们可以把它写成 W = V.T V 所以有

( A x - b ).T W ( A x - b ) =

= ( A x - b ).T V.T V ( A x - b )

= (V A x - V b ).T (V A x - V b )

因此,它简化为A -> V A b -> V b 的原始问题

注意,W 不需要是对角线,而是实数和对称的,如果存在逆矩阵,我们将能够将其对角化为 W = Q D Q.TQ 是正交的,D 是对角线。

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2021-09-02
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多