问题: cov=True
的{{1}}选项产生的对角线具有非感性负值。
UPDATE:在玩了这个之后,我真的开始怀疑numpy中的错误?那可能吗?从数据集中删除任意一对13值将解决问题。
我正在使用np.polyfit()
来计算数据集的斜率和截距系数。值的图形产生非常线性(但不完美)的线性图。我试图用np.polyfit()
得到这些系数的标准差;但是,这会引发错误,因为对角线包含负值。
在数学上不可能产生具有负对角线的协变量矩阵 - numpy做错了什么?
以下是重现问题的片段:
np.sqrt(np.diag(cov))
答案 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])
您必须相应地重新调整结果。