Scipy最小二乘警告:“无法估计参数的协方差”

问题描述

使用scipy.optimize.curve_fit()获取参数的协方差似乎是一个常见的问题,但是常见的解决方案对我没有太大帮助。 (没有给出很好的初始猜测,没有足够的数据点,没有输入numpy数组,没有使用float64。)这重现了我的错误

x = np.array([103.15,113.15,269.3,273.15,283.15,290.0,293.15,296.15,303.15,310.0,313.15,318.15,323.15,330.0,333.15,348.16,350.0,353.15])
y = np.array([-0.2468283,-0.19681169,-0.01856526,-0.01707074,-0.01698771,-0.01333444,-0.01072733,-0.00986383,-0.00974759,-0.00830289,-0.00896712,-0.00699103,-0.00667552,-0.0063102,-0.00440053,-0.00368648,-0.0034374,-0.00199269,-0.00092992,-0.00066423,0.00106277,0.00166058,0.00464962,0.0060445,0.00650947])

((u0,u1,r0,r1),pcov) = scipy.optimize.curve_fit(f,x,y,p0=np.array([1.0,0.01,0.3,0.5]))
    
print(u0,r1)
print(pcov)

我的职能是:

def f(x,u0,r1):
    k = 8.617333262145E-5

    term1 = (np.exp(-u0/(k*x)) - np.exp(u1/(k*x))) * r0**3
    term2 = (np.exp(u1/(k*x)) - 1) * r1**3
    
return -(2 * np.pi / 3) * (term1 + term2)

输出

OptimizeWarning: Covariance of the parameters Could not be estimated
  warnings.warn('Covariance of the parameters Could not be estimated',1.0 0.010062693926842859 0.3093891634616651 0.4627801922742623
[[inf inf inf inf]
 [inf inf inf inf]
 [inf inf inf inf]
 [inf inf inf inf]]

以最佳拟合绘制数据点显示出极佳的匹配度。我不太确定如何用协方差来解决这个问题。有什么想法吗?

解决方法

根据documentation

如果解中的雅可比矩阵不具有完整等级,则“ lm”方法返回一个填充有np.inf的矩阵,另一方面,“ trf”和“ dogbox”方法使用Moore- Penrose伪逆来计算协方差矩阵。

我尝试在您的数据上使用method='trf',但似乎可以正常工作。我不知道为什么在这种情况下,雅可比定律是不可逆的。