首页 > 解决方案 > numpy.linalg.det() 可以计算错误吗?同一矩阵的两个不同结果

问题描述

我发现了一个非常有趣的情况。谁能告诉我为什么会这样?

对于一个矩阵,我运行了两段不同的代码来计算它的协方差矩阵。2个结果看起来一样。但它们的决定因素之间存在巨大差距。这是代码:

X = np.array([[11,5,3,34,8],[25,9,2,6,345],[96,13,8823,8,4],[92,15,153,9,12],[7,14,345,31,10]])
Xbar, mu, std = normalize(X)

S = (1/Xbar.shape[0]) * np.dot(Xbar.T, Xbar)
print('DIY covariance matrix:\n', S)
print('determinant:\n', np.linalg.det(S))
print('\n')

SbyNp = np.cov(Xbar, rowvar=False, bias=True)
print('numpy.linalg covariance matrix:\n', SbyNp)
print('determinant:\n', np.linalg.det(SbyNp))

np.testing.assert_almost_equal(S, SbyNp)
np.testing.assert_almost_equal(np.linalg.det(S), np.linalg.det(SbyNp))

运行结果:

DIY covariance matrix:
 [[ 1.          0.57159341  0.62932008 -0.7149413  -0.27222462]
 [ 0.57159341  1.          0.26958072 -0.39024794 -0.29147673]
 [ 0.62932008  0.26958072  1.         -0.38189298 -0.28405386]
 [-0.7149413  -0.39024794 -0.38189298  1.         -0.4706952 ]
 [-0.27222462 -0.29147673 -0.28405386 -0.4706952   1.        ]]
determinant:
 -1.4290811771081465e-16


numpy.linalg covariance matrix:
 [[ 1.          0.57159341  0.62932008 -0.7149413  -0.27222462]
 [ 0.57159341  1.          0.26958072 -0.39024794 -0.29147673]
 [ 0.62932008  0.26958072  1.         -0.38189298 -0.28405386]
 [-0.7149413  -0.39024794 -0.38189298  1.         -0.4706952 ]
 [-0.27222462 -0.29147673 -0.28405386 -0.4706952   1.        ]]
determinant:
 5.716324708432541e-17

为什么这些决定因素不同?numpy.linalg.det() 中是否有任何错误?

标签: pythonnumpymatrix

解决方案


推荐阅读