来自np.polyfit()的协方差矩阵具有负对角线?

时间:2016-10-17 20:42:24

标签: python python-2.7 numpy statistics linear-regression

问题: cov=True的{​​{1}}选项产生的对角线具有非感性负值。

UPDATE:在玩了这个之后,我真的开始怀疑numpy中的错误?那可能吗?从数据集中删除任意一对13值将解决问题。

我正在使用np.polyfit()来计算数据集的斜率和截距系数。值的图形产生非常线性(但不完美)的线性图。我试图用np.polyfit()得到这些系数的标准差;但是,这会引发错误,因为对角线包含负值。

在数学上不可能产生具有负对角线的协变量矩阵 - numpy做错了什么?

以下是重现问题的片段:

np.sqrt(np.diag(cov))

1 个答案:

答案 0 :(得分:2)

看起来它与你的x值有关:它们的总范围约为3,偏移量约为15亿。

在您的代码中

np.asarray(x)

转换float64的ndarray中的x值。虽然可以正确地表示x值本身,但是进行所需的计算以获得协方差矩阵可能还不够。

np.asarray(x, dtype=np.float128)

可以解决问题,但是polyfit不能用于float128 :(

TypeError: array type float128 is unsupported in linalg

作为解决方法,您可以从x中减去偏移量,然后使用polyfit。这产生了具有正对角线的协方差矩阵:

x1 = x - np.mean(x)
z1, cov1 = np.polyfit(np.asarray(x1), np.asarray(y), 1, cov=True)
std1 = np.sqrt(np.diag(cov1))

print z1    # prints: array([  1.56607841e+03,   6.31224162e+06])
print cov1  # prints: array([[  4.56066546e+00,  -2.90980285e-07],
            #                [ -2.90980285e-07,   3.36480951e+00]])
print std1  # prints: array([ 2.13557146,  1.83434171])

您必须相应地重新调整结果。