gpt4 book ai didi

python - 为什么误差这么大?

转载 作者:行者123 更新时间:2023-12-04 14:49:18 24 4
gpt4 key购买 nike

我正在尝试拟合 a*x**b+c 形式的幂律一些数据点,使用 curve_fit来自 scripy.optimize .这是 MWE:

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

def func_powerlaw(x, m, c, c0):
return c0 + x**m * c

x = np.array([1.05, 1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.65, 0.6, 0.55])
y = np.array([1.26, 1.24, 1.2, 1.17, 1.1, 1.01, 0.95, 0.84, 0.75, 0.71, 0.63])
dy = np.array([0.078]*11)

fig, (a1) = plt.subplots(ncols=1,figsize=(10,10))
a1.errorbar(x, y, yerr = dy, ls = '', marker='o')

popt, pcov = curve_fit(func_powerlaw, x, y, sigma = dy, p0 = [0.3, 1, 1], bounds=[(0.1, -2, -2), (0.9, 10, 2)], absolute_sigma=False, maxfev=10000, method = 'trf')
perr=np.sqrt(np.diag(pcov))

xp = np.linspace(x[0],x[-1], 100)
a1.plot(xp, func_powerlaw(xp, *popt), lw=3, zorder = 1, c = 'b')
print(popt, perr)

输出:[0.35609897 3.24929422 -2.] [0.47034928 3.9030258 3.90965249]

Here's the Figure.

对于所有三个参数,误差都大于值(value)估计本身。从经验来看,这不可能是正确的,因为这条线非常适合数据点。即使我没有设置任何界限和/或初始猜测,值也会改变,但错误仍然很高。唯一需要的边界是 0.1<=m<=0.9 .我究竟做错了什么?非常感谢任何帮助!

最佳答案

拟合参数中误差的大小部分是由测量误差的大小(代码中的 dy)驱动的。正如您在图中看到的那样,西格玛相对于点的分散度很大,因此各种曲线都可以拟合数据。 dy 值在这里是硬编码的,它们是真实值吗?试着把它变小,看看它是如何影响曲线拟合误差的。此外,它们在图中看起来像绝对西格玛,因此您应该将 absolute_sigma 标志设置为 True。

作为补充说明,如果您不在 sigma 参数中提供测量误差,则默认值为 1.0(在您的情况下非常大),而不是每个 y 值都为 0.0。这解释了为什么省略 sigma 会产生更大的拟合误差。

关于python - 为什么误差这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69317927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com