与 scipy.odr 的正交距离

orthogonal distance from fit with scipy.odr

我对具有 x 和 y 不确定性且 scipy.odr 的给定数据点执行 ODR 拟合。对于拟合结果,我想查看每个点与拟合的正交距离。对于线性拟合函数,这可以很容易地计算出来,但对于任意函数,它可能会更复杂。由于 scipy.odr 正在最小化这些距离,因此它必须计算它们,所以也许可以直接访问它们,但我没有在文档中找到它。也许我错过了?有什么想法吗?

所以对于附加的示例代码,我想得到一个包含 100 个元素的数组,其中包含正交距离,然后例如绘制直方图。

import numpy as np
from scipy.odr import *

np.random.seed(1)

N = 100
x = np.linspace(0, 10, N)
y = 3*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 = Model(f)
mydata = RealData(x, y, sx=sx, sy=sy)

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

快速浏览一下文档,我认为正交距离的模型估计是它在 myoutput.delta 中带来的输入错误和 myoutput.eps 中的输出错误,将它们两者结合起来我们可以估计正交距离。

使用计算出的 y 误差,对于这个线性模型,我们可以使用一些几何来找到正交距离,即 dy * sqrt(10/81)

dy = (y - f(myoutput.beta, x))
orthogonal = np.sqrt((dy / 3)**2 + (dy / 9)**2)
plt.plot(dy, np.sqrt(myoutput.delta**2 + myoutput.eps**2), '.', label='Estimated orthogonal distance')
plt.plot(dy, orthogonal, '.', label='Exact orthogonal distance')
plt.xlabel('Vertical distance')
plt.ylabel('Orthogonal distance')
plt.legend()

估计值高于实际值是合理的,因为它可能没有正确估计拟合曲线中的最近点。