1

我有一些数据点在这些数据点的 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

resutling Beta 值显示为 1.0 和 0.0,这是我认为的。Beta Std Error但是,如果我在数据点上的错误很大,为什么标准错误 ,也都为零?谁能提供一些见解?

4

1 回答 1

3

我认为这里没有差异。您的示例模型非常适合您的数据,因此您传递给数据的权重无关紧要。此外,您的初始猜测beta0=[1.0, 0.0]是给出最优解的参数向量,因此 ODR 机制无法找到参数的迭代改进,并在零次迭代后退出。相关误差为零,因为对于给定数据,找到的解决方案比任何其他可能的解决方案都要好得多,因为您的平方B=[1, 0]为零。

ODR.run()要查看函数内部实际发生的情况,odr.set_iprint(init=2, iter=2, final=2)请在运行回归之前添加。特别是,以下输出确认 ODR 立即达到停止条件:

 --- STOPPING CONDITIONS:
         INFO =     1 ==> SUM OF SQUARES CONVERGENCE.
        NITER =     0          (NUMBER OF ITERATIONS)

请注意错误不会为零,如果您的错误不等于或不匹配最佳解决方案,则错误将NITER是一个整数。在这种情况下,ODR 返回的错误将是非零的,尽管仍然非常小。x_datay_databeta0

于 2016-10-09T16:35:31.273 回答