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)