scipy.optimize.curve_fit中的sigma是什么意思?

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

假设我有一个非常简单的模型,通过重复采样来测量一些数量。据我从统计数据中了解到,平均值的误差可以计算为 $u = rac{\hat\sigma}{\sqrt{n}}$ 其中$\hat\sigma = rac{\sum(x- ar{x})}{\sqrt{n-1}}$ 当采样 $n 时,这种不确定性将消失 ightarrow \infty$,但是由于仪器本身仍然存在不确定性(B 类不确定性)。通常人们假设两者可以平方相加。

如果这是通过曲线拟合来完成的怎么办?我正在尝试做这样的事情

fitting using a constant line

这可以通过 scipy.optimize.curve_fit 轻松完成:

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

data_length = 10000
x = np.array(range(data_length))
y = 5 * np.ones(data_length) + np.random.normal(0, 1, data_length)
u_y = 1 * np.ones(data_length)


def func(x, b):
    return  x*0 + b

popt, pcov = curve_fit(func, x,y, sigma=u_y, absolute_sigma=False)

# generate the plot
plt.errorbar(x, y, yerr=u_y, fmt='o')
plt.plot(x, func(x, *popt), 'r-')
plt.show()

print(popt)
print(np.sqrt(np.diag(pcov)))

结果出现错误 $ 右箭头 0$ 当 $n 时 ightarrow \infty$,因此这意味着有某种方法可以通过执行大量测量来击败仪器精度,这听起来完全不现实。此外,我发现如果我按

sigma=1e6*u_y
缩放 sigma ,popt 的误差不会受到影响,这意味着该函数中的 sigma 不会像与仪器给出的测量的不确定性相对应的那样运行。

我查了一下文档,发现我应该设置

absolute_sigma=True
。我尝试过,但似乎总是返回
1/np.sqrt(data_length)
,并且数据集本身的随机性不起作用。另外,这个错误在 $n 处也会消失 ightarrow \infty$ 继续让我担心。

将仪器误差纳入曲线拟合的正确方法是什么?这里的

sigma
到底代表什么?当您有多个参数时,如何将该项包含在实际曲线拟合中?我尝试过线性问题

sampling_points = int(1e2)
x = np.linspace(0, 1, sampling_points)
y = 5 * x + np.random.normal(0, 1, sampling_points)
u_y = 1 * np.ones(sampling_points)


def func(x, a, b):
    return  x*a + b

popt, pcov = curve_fit(func, x,y, sigma=1*u_y, absolute_sigma=False)

print("sample points: ", sampling_points)
print("k={pop[0]:.2f}, b={pop[1]:.2f}".format(pop=popt))
print("error of k: ", np.sqrt(pcov[0,0]))
print("error of b: ", np.sqrt(pcov[1,1]))

事实证明,您可以通过增加数据点来完全消除错误

sample points:  100
k=4.74, b=0.23
error of k:  0.37312467183800596
error of b:  0.2159669523150594

sample points:  1000000
k=5.01, b=-0.00
error of k:  0.0034627280798220374
error of b:  0.0019992075688566534
python scipy curve-fitting
1个回答
0
投票

Scipy 的曲线拟合实现了非线性最小二乘拟合。这里的 sigma 代表 y 方向的不确定性。默认情况下,X² 计算如下:

chi_sqrd = np.sum((y - f(x, *theta))**2 / sigma**2)

协方差矩阵和参数误差被计算为 hessian 矩阵的逆矩阵。这与 1/sqrt(n) 成正比。如果

sigma = True
错误将被传递到粗麻布。 (文档并没有真正指定这应该意味着什么)。两者都不是“正确的”。这是一个判断问题。

这是预期的结果。更多数据可以让我们更好地估计“真实”值,但回报会递减,因为概率分布的分辨率更高。通过足够的运行,您绝对可以获得比单次测量更高的精度。这就是进行多次测量的全部意义。

为了包含仪器不确定性,每个点的总不确定性应结合数据中的随机噪声(A 型不确定性,例如 σ_random)和仪器不确定性(B 型不确定性,例如 σ_instrument)。如果存在系统误差,则应将其作为拟合参数包含在内。智能实验设计考虑了可能的偏差。

请注意,最小二乘法并不是拟合曲线的唯一方法,并且每种方法都会产生不同的误差,因为优化函数在参数空间中的曲线不同。 (例如比较MLE

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