根据documentation,参数sigma
可用于设置拟合中数据点的权重。当参数absolute_sigma=True
时,这些“描述”1-sigma错误。
我有一些人工正态分布噪声的数据,这些数据变化如下:
n = 200
x = np.linspace(1, 20, n)
x0, A, alpha = 12, 3, 3
def f(x, x0, A, alpha):
return A * np.exp(-((x-x0)/alpha)**2)
noise_sigma = x/20
noise = np.random.randn(n) * noise_sigma
yexact = f(x, x0, A, alpha)
y = yexact + noise
如果我想使用curve_fit
将嘈杂的y
调整到f
应该将sigma
设置为什么?这里的文档不是很具体,但我通常使用1/noise_sigma**2
作为权重:
p0 = 10, 4, 2
popt, pcov = curve_fit(f, x, y, p0)
popt2, pcov2 = curve_fit(f, x, y, p0, sigma=1/noise_sigma**2, absolute_sigma=True)
不过,这似乎并不能改善身体状况。
此选项是否仅用于通过协方差矩阵更好地解释拟合不确定性?这两种说法有什么区别?
In [249]: pcov
Out[249]:
array([[ 1.10205238e-02, -3.91494024e-08, 8.81822412e-08],
[ -3.91494024e-08, 1.52660426e-02, -1.05907265e-02],
[ 8.81822412e-08, -1.05907265e-02, 2.20414887e-02]])
In [250]: pcov2
Out[250]:
array([[ 0.26584674, -0.01836064, -0.17867193],
[-0.01836064, 0.27833 , -0.1459469 ],
[-0.17867193, -0.1459469 , 0.38659059]])
至少在scipy版本1.1.0中,参数
sigma
应该等于每个参数上的错误。特别是documentation说:你的情况是:
我查看了source代码,并验证了当您以这种方式指定sigma时,它会最小化
((f-data)/sigma)**2
。顺便说一句,这个通常是当你知道错误的时候你想要最小化的。给定模型,观测点
data
的可能性由下式给出:如果取负对数,则变为(直到不依赖于参数的常数因子):
那只是广场。
我编写了一个测试程序来验证
curve_fit
是否确实返回了正确的值,并正确地指定了sigma:哪些输出:
正如您所看到的,当您将
sigma=sigma
指定为曲线拟合的参数时,chi2确实被正确地最小化了。至于为什么改进不是“更好”,我不太确定。我唯一的猜测是,在没有指定sigma值的情况下,你隐式地假设它们是相等的,并且在拟合重要的部分(峰值)上,误差是“近似”相等的。
为了回答您的第二个问题,nosigma选项不仅用于更改协方差矩阵的输出,它实际上还更改了最小化的内容。
相关问题 更多 >
编程相关推荐