Scipy的odrpack中的不对称误差条

时间:2017-07-06 08:49:48

标签: python python-3.x numpy scipy

我正在使用Scipy的odrpack将线性函数拟合到x和y维度都存在不确定性的某些数据。每个数据点都有自己的不对称不确定性。

我可以使用对称不确定性拟合函数,但这不是我数据的真实表示。

我如何才能牢记这一点?

到目前为止,这是我的代码。它接收输入数据作为命令行参数,并且我使用的不确定性只是当前的随机数。 (另外,两种情况正在发生,一种是正面数据,另一种是负面情况。原因与此问题无关)

import sys
import numpy as np
import scipy.odr.odrpack as odrpack

def f(B, x):
    return B[0]*x + B[1]

xdata = sys.argv[1].split(',')
xdata = [float(i) for i in xdata]
xdata = np.array(xdata)

#find indices of +/- data
zero_ind = np.where(xdata >= 0)[0][0]

x_p = xdata[zero_ind:]
x_m = xdata[:zero_ind+1]

ydata = sys.argv[2].split(',')
ydata = [float(i) for i in ydata]
ydata = np.array(ydata)

y_p = ydata[zero_ind:]
y_m = ydata[:zero_ind+1]

sx_m = np.random.random(len(x_m))
sx_p = np.random.random(len(x_p))

sy_m = np.random.random(len(y_m))
sy_p = np.random.random(len(y_p))

linear = odrpack.Model(f)

data_p = odrpack.RealData(x_p, y_p, sx=sx_p, sy=sy_p)
odr_p = odrpack.ODR(data_p, linear, beta0=[1.,2.])
out_p = odr_p.run()

data_m = odrpack.RealData(x_m, y_m, sx=sx_m, sy=sy_m)
odr_m = odrpack.ODR(data_m, linear, beta0=[1.,2.])
out_m = odr_m.run()

谢谢!

1 个答案:

答案 0 :(得分:0)

我将为您提供随机数据的解决方案,我无法轻松导入您的数据

import numpy as np
import scipy.odr.odrpack as odrpack
np.random.seed(1)

N = 10
x = np.linspace(0,5,N)*(-1)
y = 2*x - 1 + np.random.random(N)
sx = np.random.random(N)
sy = np.random.random(N)

def f(B, x):
    return B[0]*x + B[1]
linear = odrpack.Model(f)
# mydata = odrpack.Data(x, y, wd=1./np.power(sx,2), we=1./np.power(sy,2))
mydata = odrpack.RealData(x, y, sx=sx, sy=sy)

myodr = odrpack.ODR(mydata, linear, beta0=[1., 2.])
myoutput = myodr.run()
myoutput.pprint()

比我们得到

Beta: [ 1.92743947 -0.94409236]
Beta Std Error: [ 0.03117086  0.11273067]
Beta Covariance: [[ 0.02047196  0.06690713]
 [ 0.06690713  0.26776027]]
Residual Variance: 0.04746112419196648
Inverse Condition #: 0.10277763521624257
Reason(s) for Halting:
  Sum of squares convergence