我有一些数据点在这些数据点的x和y坐标上都有错误。因此,我想使用python的ODR工具来计算最佳拟合斜率和此斜率上的误差。我已经尝试过为我的实际数据而做,但没有找到好的结果。因此,我首先尝试使用ODR,其示例如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.odr import *
def linear_func(B, x):
return B[0]*x+B[1]
x_data=np.array([0.0, 1.0, 2.0, 3.0])
y_data=np.array([0.0, 1.0, 2.0, 3.0])
x_err=np.array([1.0, 1.0, 1.0, 1.0])
y_err=np.array([5.0, 5.0, 5.0, 5.0])
linear=Model(linear_func)
data=RealData(x_data, y_data, sx=x_err, sy=y_err)
odr=ODR(data, linear, beta0=[1.0, 0.0])
out=odr.run()
out.pprint()
pprint()
行给出:
Beta: [ 1. 0.]
Beta Std Error: [ 0. 0.]
Beta Covariance: [[ 5.20000039 -7.80000026]
[ -7.80000026 18.1999991 ]]
Residual Variance: 0.0
Inverse Condition #: 0.0315397386692
Reason(s) for Halting:
Sum of squares convergence
重新推测的Beta值显示为1.0和0.0,我将会看到。但是,如果数据点上的错误非常大,为什么标准错误Beta Std Error
也都为零?任何人都可以提供一些见解吗?
答案 0 :(得分:2)
我认为这里没有差异。您的示例模型非常适合您的数据,因此传递给数据的权重无关紧要。此外,您的初始猜测beta0=[1.0, 0.0]
是一个给出最优解的参数向量,因此ODR机制无法找到参数的迭代改进并在零迭代后退出。相关错误为零,因为对于给定数据,找到的解决方案比任何其他解决方案都要好,因为B=[1, 0]
ODR.run()
为零。
要查看odr.set_iprint(init=2, iter=2, final=2)
函数中实际发生的情况,请在运行回归之前添加 --- STOPPING CONDITIONS:
INFO = 1 ==> SUM OF SQUARES CONVERGENCE.
NITER = 0 (NUMBER OF ITERATIONS)
。特别是,以下输出确认ODR立即达到停止状态:
NITER
请注意,不的错误如何为零,如果x_data
不等于y_data
或beta0
,则SELECT ActorName, ShowName, ROUND(ActorRate*ShowDuration/60, 2) AS [TotalEarnings]
FROM (tblActors
INNER JOIN tblRoles
ON tblActors.ActorID=tblRoles.ActorID)
INNER JOIN tblShows
ON tblShows.ShowID=tblRoles.ShowID
ORDER BY ActorName
将为整数1}}与最佳解决方案不匹配。在这种情况下,ODR返回的错误将是非零的,尽管仍然非常小。