Scipy curve_fit返回正确的参数,但协方差矩阵为无穷大



我正在测试scipy.optimize函数curve_fit()。我正在测试一个二次函数,我已经为这个问题手动分配了x和y数据。对于的参数值,我确实得到了预期的答案,基本上每次猜测都是。然而,我注意到,对于第一个参数不接近0的猜测(尤其是在1之后(,我得到了一个充满无穷大的协方差矩阵。我不知道为什么这么简单的测试会失败。

# python version: 3.9.7
# using a venv
# numpy version: 1.23.2
# scipy version: 1.9.0
import numpy as np
from scipy.optimize import curve_fit
# data taken from a quadratic function of: y = 3*x**2 + 2
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float64)
y = np.array([2, 5, 14, 29, 50, 77, 110, 149, 194, 245, 302], dtype=np.float64)
# quadratic function
def func(x, a, b, c):
return a * x**2 + b * x + c
# test to reproduce success case - notice that we have success when changing the first value upto a value of 1.0
success = [0, 0, 0]
# test to reproduce failure case
failure = [4, 0, 0]
popt, pcov = curve_fit(func, x, y, p0=failure)  # change p0 to success or failure
print(popt)  # expected answer is [3, 0, 2]
print(pcov)  # covariance matrix

只有当每个变量都得到优化时,协方差矩阵才真正有用(通常只能计算(。这通常意味着变量从其初始值移开,并且在某种程度上可以确定拟合质量(通常为卡方(与改变该变量值的相关性。

事实证明,如果最初的猜测不正确,可能就找不到解决方案——而且一些变量实际上可能不会从它们的初始值中移动。我想这就是你正在发生的事情。

初始值";0";特别麻烦,因为合身的人真的不知道";如何为零";就是这样;幅度小于1e-16〃;或";幅度小于1";?即使使用CCD_ 3的初始值也会得到很好的解决方案。

另一个潜在的问题是;数据";正是由模型函数和值给出的。在";正确的解决方案";,残差将非常非常接近于零,并且将导数的雅可比矩阵(相对于变量的不匹配(转换为协方差在数值上可能是不稳定的。对于真实数据来说,这是不太可能的,但您可能希望在建模的数据中添加少量噪声。

我不知道你为什么期望一个不同的协方差矩阵。文件上写着:

如果解决方案中的雅可比矩阵没有完整的秩,那么'lm'方法返回一个充满np.inf 的矩阵

据我所知,雅可比矩阵是在优化过程中估计的,根据您使用的初始化情况,可能会发生上述情况。注意,popt的结果仍然收敛!

最新更新