非线性回归中的标准误差

8
我最近用Python进行Monte Carlo物理模拟,但我无法确定非线性最小二乘拟合系数的标准误差。
起初,我使用SciPy的scipy.stats.linregress作为我的模型,因为我认为它是一个线性模型,但后来发现它实际上是某种幂函数。然后我使用NumPy的polyfit,并将自由度设置为2,但我找不到任何确定系数标准误差的方法。
我知道gnuplot可以为我确定误差,但我需要针对30个以上不同情况进行拟合。请问有没有人知道Python是否可以从gnuplot读取标准误差,或者我可以使用其他库?
2个回答

14

终于找到了这个长期以来备受关注的问题的答案!我希望这能至少为一些人节省几个小时对这个主题进行无望研究。Scipy在其optimize部分中有一个特殊函数称为curve_fit。它使用最小二乘法确定系数,而且最重要的是,它提供了协方差矩阵。协方差矩阵包含每个系数的方差。更确切地说,矩阵的对角线是方差,通过对值进行平方根运算,可以确定每个系数的标准误差!Scipy没有针对此进行太多的文档说明,因此这里提供一个样例代码以便更好地理解:

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plot


def func(x,a,b,c):
    return a*x**2 + b*x + c #Refer [1]

x = np.linspace(0,4,50)
y = func(x,2.6,2,3) + 4*np.random.normal(size=len(x)) #Refer [2] 


coeff, var_matrix = curve_fit(func,x,y)
variance = np.diagonal(var_matrix) #Refer [3]

SE = np.sqrt(variance) #Refer [4]

#======Making a dictionary to print results========
results = {'a':[coeff[0],SE[0]],'b':[coeff[1],SE[1]],'c':[coeff[2],SE[2]]}

print "Coeff\tValue\t\tError"
for v,c in results.iteritems():
    print v,"\t",c[0],"\t",c[1]
#========End Results Printing=================

y2 = func(x,coeff[0],coeff[1],coeff[2]) #Saves the y values for the fitted model

plot.plot(x,y)
plot.plot(x,y2)

plot.show()
  1. 这个函数返回的内容很关键,因为它定义了用于拟合模型的内容。
  2. 使用该函数创建一些任意数据+噪声
  3. 将协方差矩阵的对角线保存到一个1D矩阵中,这只是一个普通的数组
  4. 对方差进行平方根运算以获得标准误差(SE)

2
看起来gnuplot使用levenberg-marquardt,而且有一个Python 实现可用 - 你可以从mpfit.covar属性中获取误差估计(顺便说一句,你应该担心误差估计的“含义” - 其他参数是否允许调整来补偿,例如?)

谢谢提供链接!最终我没有使用mpfit,但是文档对我理解scipy的curve_fit有很大帮助! - syntaxing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接