【问题标题】:Python / Scipy - implementing optimize.curve_fit 's sigma into optimize.leastsqPython / Scipy - 将 optimize.curve_fit 的 sigma 实现到 optimize.leastsq
【发布时间】:2013-05-06 18:56:06
【问题描述】:
我正在使用逻辑模型拟合数据点。由于有时我的数据存在 ydata 错误,因此我首先使用 curve_fit 及其 sigma 参数将我的个人标准偏差包含在拟合中。
现在我切换到了 leastsq,因为我还需要一些曲线拟合无法提供的拟合优度估计。一切都很好,但现在我错过了像“sigma”对curve_fit一样加权最小平方的可能性。
有人有一些代码示例说明如何在最小平方中加权最小二乘吗?
谢谢你,伐木工
【问题讨论】:
标签:
python
scipy
curve-fitting
least-squares
【解决方案1】:
scipy.optimize.curve_fit docs 说:
pcov:二维数组
popt 的估计协方差。对角线提供参数估计的方差。要计算参数的一个标准差误差,请使用 perr = np.sqrt(np.diag(pcov))。 sigma 参数如何影响估计的协方差取决于 absolute_sigma 参数,如上所述。
以及关于
的部分
absolute_sigma : bool,可选
如果为 True,则以绝对意义使用 sigma,估计的参数协方差 pcov 反映了这些绝对值。
如果为 False,则只有 sigma 值的相对大小很重要。返回的参数协方差矩阵 pcov 基于按常数因子缩放 sigma。这个常数是通过要求当使用缩放的 sigma 时优化参数 popt 的减少 chisq 等于统一来设置的。换句话说,sigma 被缩放以匹配拟合后残差的样本方差。数学上,pcov(absolute_sigma=False) = pcov(absolute_sigma=True) * chisq(popt)/(M-N)
因此,您可以将 absolute_sigma 保留为默认值 (False),然后使用
perr = np.sqrt(np.diag(pcov))
fitStdErr0 = perr[0]
fitStdErr1 = perr[1]
...
获取每个拟合参数的标准偏差误差(作为一维 numpy 数组)。现在您可以选择有用的成员(并以most representative of your data 的方式组合它们)。
【解决方案2】:
我刚刚发现可以结合两全其美,并使用选项 full_output 也可以从 curve_fit() 获得完整的 leastsq() 输出:
popt, pcov, infodict, errmsg, ier = curve_fit(func, xdata, ydata, sigma = SD, full_output = True)
这给了我 infodict,我可以用它来计算我所有的拟合优度,并让我同时使用 curve_fit 的 sigma 选项...
【解决方案3】:
假设您的数据在数组x、y 和yerr 中,模型为f(p, x),只需将要最小化的误差函数定义为(y-f(p,x))/yerr。