<p>正如<a href="https://stackoverflow.com/a/27230609/577088">rustil</a>的回答所说,这是由应用于协方差方程分母的偏差校正引起的,这将导致此输入的零除。这一更正背后的推理与<a href="http://en.wikipedia.org/wiki/Bessel%27s_correction" rel="nofollow noreferrer">Bessel's Correction</a>背后的推理相似。这实际上是一个信号,表明有太少的数据点,以一个明确的方式估计协方差。在</p>
<p>如何避开这个问题?这个版本的权重。您可以添加另一个数据点,但要在epsilon处加权。这相当于将<a href="https://github.com/numpy/numpy/blob/v1.9.1/numpy/lib/polynomial.py#L599" rel="nofollow noreferrer">this formula</a>中的<code>2.0</code>还原为<code>1.0</code>。在</p>
<pre><code>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
</code></pre>
<p>输出。请注意,拟合值是相同的:</p>
^{pr2}$
<p>我不确定这是否特别有意义,但这是解决问题的一种方法。不过,这有点糊涂。对于更健壮的方法,可以修改<code>polyfit</code>以接受它自己的<code>ddof</code>参数,也许可以代替<code>cov</code>当前接受的布尔值。(我只是<a href="https://github.com/numpy/numpy/issues/5337" rel="nofollow noreferrer">opened an issue</a>建议这么多。)</p>
<p>关于<code>cov</code>计算的最后一点提示:如果你看一下<a href="http://en.wikipedia.org/wiki/Linear_least_squares_%28mathematics%29#Parameter_errors_and_correlation" rel="nofollow noreferrer">least squares regression</a>上的维基百科页面,你会发现系数协方差的简化公式是<code>inv(dot(dot(X, W), X))</code>,至少粗略地说,numpy代码中有一个<a href="https://github.com/numpy/numpy/blob/v1.9.1/numpy/lib/polynomial.py#L593" rel="nofollow noreferrer">corresponding line</a>。在本例中,<code>X</code>是<a href="https://github.com/numpy/numpy/blob/v1.9.1/numpy/lib/polynomial.py#L563" rel="nofollow noreferrer">Vandermonde matrix</a>,权重已经是<a href="https://github.com/numpy/numpy/blob/v1.9.1/numpy/lib/polynomial.py#L566" rel="nofollow noreferrer">multiplied in</a>。numpy代码也做一些缩放(我理解;这是最小化数值误差的策略的一部分)并将结果乘以残差的范数(我不明白;我只能猜测它是另一个版本的协方差公式的一部分)。在</p>