Python 使用scipy曲线的正确拟合,包括x中的错误?
我正在尝试使用Python 使用scipy曲线的正确拟合,包括x中的错误?,python,numpy,scipy,curve-fitting,Python,Numpy,Scipy,Curve Fitting,我正在尝试使用scipy.optimize.curve\u fit来拟合直方图,其中包含一些数据。如果我想在y中添加错误,我只需将权重应用于配合即可。但是如何应用x中的错误(即,直方图中的分块错误) 我的问题也适用于使用curve_fit或polyfit进行线性回归时x中的错误;我知道如何在y中添加错误,但不知道如何在x中添加错误 以下是一个示例(部分来自于): 现在,这个适合(当它不失败)确实考虑了Y-错误 SigaMyn,但我没有找到一种方法来考虑 SigMaxx/Cuth>。我扫描了sci
scipy.optimize.curve\u fit
来拟合直方图,其中包含一些数据。如果我想在y
中添加错误,我只需将权重
应用于配合即可。但是如何应用x
中的错误(即,直方图中的分块错误)
我的问题也适用于使用curve_fit
或polyfit
进行线性回归时x
中的错误;我知道如何在y
中添加错误,但不知道如何在x
中添加错误
以下是一个示例(部分来自于):
现在,这个适合(当它不失败)确实考虑了Y-错误<代码> SigaMyn,但我没有找到一种方法来考虑<代码> SigMaxx/Cuth>。我扫描了scipy邮件列表上的几个线程,发现了如何使用
绝对值和Stackoverflow上的一篇文章,但没有发现两个方向上的错误。是否有可能实现?scipy.optmize.curve_fit
使用标准非线性最小二乘优化,因此仅将响应变量的偏差降至最低。如果您想考虑自变量中的错误,可以尝试使用正交距离回归的scipy.odr
。顾名思义,它最小化了自变量和因变量
请看下面的示例。fit_type
参数确定是scipy.odr
进行完全odr(fit_type=0
)还是最小二乘优化(fit_type=2
)
编辑
虽然这个例子有效,但它没有多大意义,因为y数据是在嘈杂的x数据上计算的,这只会导致一个不等间距的不可测变量。我更新了示例,该示例现在还显示了如何使用RealData
,它允许指定数据的标准误差,而不是权重
from scipy.odr import ODR, Model, Data, RealData
import numpy as np
from pylab import *
def func(beta, x):
y = beta[0]+beta[1]*x+beta[2]*x**3
return y
#generate data
x = np.linspace(-3,2,100)
y = func([-2.3,7.0,-4.0], x)
# add some noise
x += np.random.normal(scale=0.3, size=100)
y += np.random.normal(scale=0.1, size=100)
data = RealData(x, y, 0.3, 0.1)
model = Model(func)
odr = ODR(data, model, [1,0,0])
odr.set_job(fit_type=2)
output = odr.run()
xn = np.linspace(-3,2,50)
yn = func(output.beta, xn)
hold(True)
plot(x,y,'ro')
plot(xn,yn,'k-',label='leastsq')
odr.set_job(fit_type=0)
output = odr.run()
yn = func(output.beta, xn)
plot(xn,yn,'g-',label='odr')
legend(loc=0)
我不知道曲线拟合是否可以处理x中的错误,但scipy.optimize.odr可以。实际上,它对因变量进行正交距离回归,而不是简单的最小二乘法。谢谢你的评论!我没有找到另一个fit函数(顺便说一句,odr在scipy.odr中,而不是在scipy.optimize.odr中)。非常好用,谢谢!如果您将您的评论作为答案发布,我很乐意接受它作为解决方案。:-)@克里斯蒂安。你可以把你的评论作为一个答案…很好的答案!你知道output.sd_beta
和np.sqrt(np.diag(output.cov_beta))
之间的区别吗?哪一个对应于参数的不确定性?谢谢。scipy文档指的是原始文件。所有信息都应该在那里。我使用sd_beta作为参数的不确定性。实际上,由于sb_beta和cov_beta,scipy或ODR中可能存在错误。我问了一个关于那个@ChristianK的问题。就我所知,bug报告是开放的,为什么你说它不是bug?写这篇文章的用户称它为bug,他打开了(它仍然开放,并由scipy开发人员确认)。如果你不相信这是一个错误,你应该去那里解释你的原因。
from scipy.odr import ODR, Model, Data, RealData
import numpy as np
from pylab import *
def func(beta, x):
y = beta[0]+beta[1]*x+beta[2]*x**3
return y
#generate data
x = np.linspace(-3,2,100)
y = func([-2.3,7.0,-4.0], x)
# add some noise
x += np.random.normal(scale=0.3, size=100)
y += np.random.normal(scale=0.1, size=100)
data = RealData(x, y, 0.3, 0.1)
model = Model(func)
odr = ODR(data, model, [1,0,0])
odr.set_job(fit_type=2)
output = odr.run()
xn = np.linspace(-3,2,50)
yn = func(output.beta, xn)
hold(True)
plot(x,y,'ro')
plot(xn,yn,'k-',label='leastsq')
odr.set_job(fit_type=0)
output = odr.run()
yn = func(output.beta, xn)
plot(xn,yn,'g-',label='odr')
legend(loc=0)