Scipy ODR的结果,sd_beta的相对误差很大。

问题描述 投票:0回答:1

在一些实验数据上运行ODR算法时,有人要求我用以下模型运行。

fitting function 1

很明显,这个拟合函数包含了一个多余的自由度。

当我在实验数据上运行拟合时,我得到了巨大的β的相对误差,从8000%的相对误差开始。

当我再次尝试运行拟合,但用一个没有冗余自由度的拟合函数,如。

hyperbolic fitting

我没有得到这样的问题。

为什么会出现这种情况?为什么ODR算法对冗余自由度如此敏感?我没能向我的主管回答这些问题。希望能得到解答。

转载代码示例。
from scipy.odr import RealData, Model, ODR


def func1(a, x):
    return a[0] * (x + a[1]) / (a[3] * (x + a[1]) + a[1] * x) + a[2]


def func2(a, x):
    return a[0] / (x + a[1]) + a[2]


# fmt: off
zx = [
    1911.125, 2216.95, 2707.71, 3010.225, 3410.612, 3906.015, 4575.105, 5517.548,
    6918.481,
]
dx = [
    0.291112577, 0.321695254, 0.370771197, 0.401026507, 0.441068641, 0.490601621,
    0.557573268, 0.651755155, 0.79184836,
]
zy = [
    0.000998056, 0.000905647, 0.000800098, 0.000751041, 0.000699982, 0.000650532,
    0.000600444, 0.000550005, 0.000500201,
]
dy = [
    5.49029e-07, 5.02824e-07, 4.5005e-07, 4.25532e-07, 3.99991e-07, 3.75266e-07,
    3.50222e-07, 3.25003e-07, 3.00101e-07,
]
# fmt: on

data = RealData(x=zx, y=zy, sx=dx, sy=dy)

print("Func 1")
print("======")
beta01 = [
    1.46,
    4775.4,
    0.01,
    1000,
]
model1 = Model(func1)
odr1 = ODR(data, model1, beta0=beta01)
result1 = odr1.run()
print("beta", result1.beta)
print("sd beta", result1.sd_beta)
print("relative", result1.sd_beta / result1.beta * 100)


print()
print()


print("Func 2")
print("======")
beta02 = [
    1,
    1,
    1,
]
model2 = Model(func2)
odr2 = ODR(data, model2, beta0=beta02)
result2 = odr2.run()
print("beta", result2.beta)
print("sd beta", result2.sd_beta)
print("relative", result2.sd_beta / result2.beta * 100)

这个打印出来的是:

Func 1
======
beta [ 1.30884537e+00 -2.82585952e+03  7.79755196e-04  9.47943376e+01]
sd beta [1.16144608e+02 3.73765816e+06 6.12613738e-01 4.20775596e+03]
relative [   8873.82193523 -132266.24068473   78564.88054498    4438.82627453]


Func 2
======
beta [1.40128121e+00 9.80844274e+01 3.00511669e-04]
sd beta [2.73990552e-03 3.22344713e+00 3.74538794e-07]
relative [0.1955286  3.28640051 0.12463369]
ScipyNumpyPython版本信息:

版本信息是:

  • Scipy - 1.4.1
  • 1.4.1 Numpy - 1.18.2
  • 蟒蛇 - 3.7.2
python numpy scipy curve-fitting one-definition-rule
1个回答
0
投票

问题不在于自由度。

自由度是数据点的数量和拟合参数的数量之差.问题是两个公式的自由度数是一样的,因为它们的参数数是一样的.看起来你也没有自由度,这是一个好消息,这意味着它有可能被拟合。

然而,你说的没错,第一个表达式有一些问题:你试图拟合的参数不是独立的。

用一些更简单的例子可能会更好理解。

考虑以下表达式。

y = x + b + c

你试图拟合,给定 n 数据为 xyn >> 2.

问题是:什么是最佳值?bc? 这是无法回答的。你只能说 xy 数据是关于组合的。因此,如果 b + c0,配合不能告诉我们是否 b = 1000, c = -1000b = 1, c= -1但至少我们可以说,鉴于 b 我们可以确定 c.什么是错误的 鉴于 b? 有可能是无限的。这就是拟合给你那么大相对误差的原因。

© www.soinside.com 2019 - 2024. All rights reserved.