繁体   English   中英

numpy.polyfit给出有用的拟合,但无穷协方差矩阵

[英]numpy.polyfit gives useful fit, but infinite covariance matrix

我正在尝试将多项式拟合到一组数据。 有时可能会发生numpy.ployfit返回的协方差矩阵仅由inf组成,尽管拟合似乎很有用。 数据中没有numpy.inf或'numpy.nan'!

例:

import numpy as np
# sample data, does not contain really x**2-like behaviour, 
# but that should be visible in the fit results
x = [-449., -454., -459., -464., -469.]
y = [ 0.9677024,   0.97341953,  0.97724978,  0.98215678,  0.9876293]

fit, cov = np.polyfit(x, y, 2, cov=True)

print 'fit: ', fit
print 'cov: ', cov

结果:

fit: [  1.67867158e-06   5.69199547e-04   8.85146009e-01]
cov: [[ inf  inf  inf]
      [ inf  inf  inf]
      [ inf  inf  inf]]

np.cov(x,y)给出

[[  6.25000000e+01  -6.07388099e-02]
 [ -6.07388099e-02   5.92268942e-05]]

因此, np.covnp.polyfit返回的协方差np.polyfit 有人知道发生了什么吗?

编辑:我现在明白了numpy.cov不是我想要的。 我需要多项式系数的方差,但是如果(len(x) - order - 2.0) == 0 ,我不会得到它们。 还有另一种方法来获取拟合多项式系数的方差吗?

正如rustil的回答所述,这是由应用于协方差方程的分母的偏差校正引起的,该偏差对该输入造成零除。 此更正背后的原因与Bessel的更正背后的原因相似。 这实际上是一个信号,表明数据点太少,无法以明确的方式估计协方差。

如何解决这个问题? 好吧,这个版本的polyfit接受权重 您可以添加另一个数据点,但是将其加权为epsilon。 这等效于将该公式中2.0减小为1.0

x = [-449., -454., -459., -464., -469.]
y = [ 0.9677024,   0.97341953,  0.97724978,  0.98215678,  0.9876293]

x_extra = x + x[-1:]
y_extra = y + y[-1:]
weights = [1.0, 1.0, 1.0, 1.0, 1.0, sys.float_info.epsilon]

fit, cov = np.polyfit(x, y, 2, cov=True)
fit_extra, cov_extra = np.polyfit(x_extra, y_extra, 2, w=weights, cov=True)

print fit == fit_extra
print cov_extra

输出。 请注意,拟合值是相同的:

>>> print fit == fit_extra
[ True  True  True]
>>> print cov_extra
[[  8.84481850e-11   8.11954338e-08   1.86299297e-05]
 [  8.11954338e-08   7.45405039e-05   1.71036963e-02]
 [  1.86299297e-05   1.71036963e-02   3.92469307e+00]]

非常不确定,这将是特别有意义,但它是解决该问题的方法。 不过这有点不合时宜。 对于更强大的功能,您可以修改polyfit以接受其自己的ddof参数,也许可以代替cov当前接受的布尔值。 (我刚刚提出了一个建议的问题 。)

关于cov计算的快速最后说明:如果您在Wikipedia页面上查看最小二乘回归 ,则会发现系数协方差的简化公式为inv(dot(dot(X, W), X)) ,它在numpy代码中具有相应的行 -至少可以粗略地说。 在这种情况下, XVandermonde矩阵 ,并且权重已经乘以 numpy代码也进行了一些缩放(我理解;这是使数值误差最小化的一部分),并将结果乘以残差范数(我不理解;我只能猜测这是另一个版本的一部分)的协方差公式)。


区别应该在于自由度。 polyfit方法中,已经考虑到您的学位是2,因此导致:

RuntimeWarning: divide by zero encountered in true_divide
  fac = resids / (len(x) - order - 2.0)

您可以将ddof=关键字(ddof =自由度Delta)传递给np.cov ,您将遇到相同的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM