NumPy:为什么np.linalg.eig和np.linalg.svd给出不同的SVD V值?

时间:2019-06-24 12:46:36

标签: python numpy linear-algebra

我正在通过遵循此SVD来学习MIT course

矩阵的构造为

C = np.matrix([[5,5],[-1,7]])
C
matrix([[ 5,  5],
        [-1,  7]])

讲师给V作为

enter image description here

这接近

w, v = np.linalg.eig(C.T*C)
matrix([[-0.9486833 , -0.31622777],
        [ 0.31622777, -0.9486833 ]])

但是np.linalg.svd(C)提供了不同的输出

u, s, vh = np.linalg.svd(C)
vh
matrix([[ 0.31622777,  0.9486833 ],
        [ 0.9486833 , -0.31622777]])

似乎vh交换了V向量中的元素,可以接受吗?

我正确理解了吗?

1 个答案:

答案 0 :(得分:3)

对于linalg.eig,您的特征值存储在w中。这些是:

>>> w
array([20., 80.])

对于奇异值分解,您可以通过对奇异值进行平方来获得特征值(C的排名最高,因此这里的一切都很容易):

>>> s**2
array([80., 20.])

您可以看到他们的订单被翻转了。

摘自linalg.eig文档:

  

特征值不一定要排序

摘自linalg.svd文档:

  

每个向量中具有奇异值的向量,它们按降序排列。 ...

在通常为您提供特征值和特征向量的例程中,不一定会按照您希望的方式对它们进行“排序”。因此,确保拥有所需特征值的特征向量始终很重要。如果需要对它们进行排序(例如,按特征值大小排序),则可以随时自己进行操作(请参见此处:sort eigenvalues and associated eigenvectors after using numpy.linalg.eig in python)。

最后请注意,vh中的包含特征向量,而在v中则是

这意味着例如:

>>> v[:,0].flatten()
matrix([[-0.9486833 ,  0.31622777]])
>>> vh[:,1].flatten()
matrix([[ 0.9486833 , -0.31622777]])

同时给定特征值20的特征向量。