相关疑难解决方法(0)

在Scipy中,curve_fit如何以及为什么计算参数估计的协方差

我一直在scipy.optimize.leastsq用来拟合一些数据.我想在这些估计值上得到一些置信区间,所以我查看cov_x输出但是文档很清楚这是什么以及如何从中得到我的参数的协方差矩阵.

首先,它说它是一个雅可比行列式,但在笔记中它也说" cov_x是雅各比式的雅可比近似",所以它实际上不是雅可比,而是一个使用雅可比的近似的Hessian.以下哪些陈述是正确的?

其次这句话对我来说很困惑:

该矩阵必须乘以残差方差,以得到参数估计的协方差 - 见curve_fit.

我确实去看看curve_fit它们所处的源代码:

s_sq = (func(popt, *args)**2).sum()/(len(ydata)-len(p0))
pcov = pcov * s_sq
Run Code Online (Sandbox Code Playgroud)

这相当于乘cov_xs_sq,但我无法找到任何参考这个公式.有人能解释为什么这个等式是正确的吗?我的直觉告诉我它应该是另一种方式,因为cov_x它应该是一个衍生物(雅可比或黑森),所以我在想: 我想要的东西cov_x * covariance(parameters) = sum of errors(residuals)在哪里sigma(parameters).

如何连接事物curve_fit正在做我所看到的例如.维基百科:http: //en.wikipedia.org/wiki/Propagation_of_uncertainty#Non-linear_combinations

python curve scipy

31
推荐指数
3
解决办法
2万
查看次数

SciPy LeastSq Fit Fit of Fit Estimator

我有一个数据表面,我使用SciPy的leastsq功能.

我想对leastsq退货后的合身质量有一些估计.我希望这可以作为函数的返回包含在内,但如果是这样的话,它似乎没有明确记录.

是否有这样的回报,或者,除非,我可以传递我的数据和返回的参数值和拟合函数的某些函数将给出我对拟合质量的估计(R ^ 2或某些此类)?

谢谢!

python scipy data-fitting

13
推荐指数
1
解决办法
1万
查看次数

Python scikit学习线性模型参数标准错误

我正在使用sklearn,特别是linear_model模块.在拟合简单的线性之后

import pandas as pd
import numpy as np
from sklearn import linear_model
randn = np.random.randn

X = pd.DataFrame(randn(10,3), columns=['X1','X2','X3'])
y = pd.DataFrame(randn(10,1), columns=['Y'])        

model = linear_model.LinearRegression()
model.fit(X=X, y=y)
Run Code Online (Sandbox Code Playgroud)

我看到我如何通过coef_和intercept_访问系数和截距,预测也很简单.我想访问这个简单模型的参数的方差 - 协方差矩阵,以及这些参数的标准误差.我熟悉R和vcov()函数,似乎scipy.optimize有一些功能(使用python中的optimize.leastsq方法获取拟合参数的标准错误) - sklearn是否具有访问这些统计信息的任何功能??

感谢任何帮助.

-Ryan

python variance linear-regression scikit-learn

12
推荐指数
2
解决办法
1万
查看次数

线性拟合包括NumPy/SciPy的所有错误

我有很多yy数据点,y需要适应非线性函数.在某些情况下,这些函数可以是线性的,但更通常是指数衰减,高斯曲线等.SciPy支持这种拟合scipy.optimize.curve_fit,我也可以指定每个点的权重.这给了我加权的非线性拟合,这很好.从结果中,我可以提取参数及其各自的错误.

只有一点需要注意:错误仅用作权重,但不包含在错误中.如果我将所有数据点的误差加倍,我预计结果的不确定性也会增加.所以我构建了一个测试用例(源代码)来测试它.

适合scipy.optimize.curve_fit给我:

Parameters: [ 1.99900756  2.99695535]
Errors:     [ 0.00424833  0.00943236]
Run Code Online (Sandbox Code Playgroud)

相同但有2 * y_err:

Parameters: [ 1.99900756  2.99695535]
Errors:     [ 0.00424833  0.00943236]
Run Code Online (Sandbox Code Playgroud)

相同但有2*y_err:

所以你可以看到值是相同的.这告诉我算法没有考虑到这些,但我认为值应该是不同的.

我在这里也读到了另一种合适的方法,所以我也尝试了scipy.odr:

Beta: [ 2.00538124  2.95000413]
Beta Std Error: [ 0.00652719  0.03870884]
Run Code Online (Sandbox Code Playgroud)

相同但有20 * y_err:

Beta: [ 2.00517894  2.9489472 ]
Beta Std Error: [ 0.00642428  0.03647149]
Run Code Online (Sandbox Code Playgroud)

值略有不同,但我认为这可以解释错误的增加.我认为这只是围绕错误或有点不同的权重.

是否有一些软件包允许我适应数据并获得实际错误?我在书中有公式,但如果我不需要,我不想自己实现.


我现在linfit.py在另一个问题中读过.这很好地处理了我的想法.它支持两种模式,第一种是我需要的.

Fit with linfit:
Parameters: [ 2.02600849  2.91759066]
Errors:     [ 0.00772283  0.04449971]

Same but with …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy

8
推荐指数
1
解决办法
3635
查看次数

从 scipy optimize.least_squares 方法获取拟合参数的协方差矩阵

我正在使用 scipy.optimize 的east_squares 方法来执行约束非线性最小二乘优化。我想知道如何获取拟合参数的协方差矩阵,以便获得拟合参数的误差线?

对于curve_fitlesssq来说,这似乎非常清楚,但对于 east_squares 方法来说,则不太清楚(至少对我来说)。

我一直在做的一种方法是,因为我知道least_squares返回雅可比矩阵J(这是“jac”返回值),那么我所做的就是用2*J^T J近似Hessian H。最后,协方差矩阵是 H^{-1},因此大约是 (2*J^TJ)^{-1},但我担心这对协方差的近似可能太粗糙?

python curve-fitting scipy data-fitting non-linear-regression

6
推荐指数
1
解决办法
6735
查看次数

如何使用 scipy.optimize.least_squares 计算标准偏差误差

我将拟合与 optimize.curve_fit 和 optimize.least_squares 进行比较。使用曲线拟合,我将协方差矩阵 pcov 作为输出,我可以通过以下方式计算拟合变量的标准偏差误差:

perr = np.sqrt(np.diag(pcov))
Run Code Online (Sandbox Code Playgroud)

如果我使用least_squares 进行拟合,则不会得到任何协方差矩阵输出,并且无法计算变量的标准偏差误差。

这是我的例子:

#import modules
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.optimize import least_squares

noise = 0.5
N = 100
t = np.linspace(0, 4*np.pi, N)

# generate data
def generate_data(t, freq, amplitude, phase, offset, noise=0, n_outliers=0, random_state=0):
    #formula for data generation with noise and outliers
    y = np.sin(t * freq + phase) * amplitude + offset
    rnd = np.random.RandomState(random_state)
    error = …
Run Code Online (Sandbox Code Playgroud)

python scipy least-squares

6
推荐指数
2
解决办法
4405
查看次数

基于最小二乘法拟合SIR模型

我想优化 SIR 模型的拟合。如果我只用 60 个数据点拟合 SIR 模型,我会得到一个“好”的结果。“好”意味着,拟合模型曲线接近数据点,直到 t=40。我的问题是,我怎样才能得到更好的拟合,也许基于所有数据点?

ydata = ['1e-06', '1.49920166169172e-06', '2.24595472686361e-06', '3.36377954575331e-06', '5.03793663882291e-06', '7.54533628058909e-06', '1.13006564683911e-05', '1.69249500601052e-05', '2.53483161761933e-05', '3.79636391699325e-05', '5.68567547875179e-05', '8.51509649182741e-05', '0.000127522555808945', '0.000189928392105942', '0.000283447055673738', '0.000423064043409294', '0.000631295993246634', '0.000941024110897193', '0.00140281896645859', '0.00209085569326554', '0.00311449589149717', '0.00463557784224762', '0.00689146863803467', '0.010227347567051', '0.0151380084180746', '0.0223233100045688', '0.0327384810150231', '0.0476330618585758', '0.0685260046667727', '0.0970432959143974', '0.134525888779423', '0.181363340075877', '0.236189247803334', '0.295374180276257', '0.353377036130714', '0.404138746080267', '0.442876028839178', '0.467273954573897', '0.477529937494976', '0.475582401936257', '0.464137179474659', '0.445930281787152', '0.423331710456602', '0.39821360956389', '0.371967226561944', '0.345577884704341', '0.319716449520481', '0.294819942458255', '0.271156813453547', '0.24887641905719', '0.228045466022105', '0.208674420183194', '0.190736203926912', '0.174179448652951', '0.158937806544529', '0.144936441326754', '0.132096533873646', '0.120338367115739', '0.10958340819268', '0.099755679236243', '0.0907826241267504', '0.0825956203546979', '0.0751302384111894', '0.0683263295744258', '0.0621279977639921', '0.0564834809370572', '0.0513449852139111', '0.0466684871328814', '0.042413516167789', '0.0385429293775096', …
Run Code Online (Sandbox Code Playgroud)

python curve-fitting scipy least-squares model-fitting

4
推荐指数
1
解决办法
4413
查看次数

符合scipy.optimize参数的错误

我将scipy.optimize.minimizehttps://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html)函数与结合使用method='L-BFGS-B

上面返回的示例如下:

      fun: 32.372210618549758
 hess_inv: <6x6 LbfgsInvHessProduct with dtype=float64>
     jac: array([ -2.14583906e-04,   4.09272616e-04,  -2.55795385e-05,
         3.76587650e-05,   1.49213975e-04,  -8.38440428e-05])
  message: 'CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH'
     nfev: 420
      nit: 51
   status: 0
  success: True
        x: array([ 0.75739412, -0.0927572 ,  0.11986434,  1.19911266,  0.27866406,
       -0.03825225])
Run Code Online (Sandbox Code Playgroud)

x值正确包含适合的参数。如何计算与这些参数相关的误差?

numpy curve-fitting scipy

4
推荐指数
1
解决办法
2460
查看次数