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

9 python numpy linear-algebra

我正在按照麻省理工学院的课程学习SVD

矩阵被构造为

C = np.matrix([[5,5],[-1,7]])
C
matrix([[ 5,  5],
        [-1,  7]])
Run Code Online (Sandbox Code Playgroud)

讲师给出的 V 为

在此处输入图片说明

这接近于

w, v = np.linalg.eig(C.T*C)
matrix([[-0.9486833 , -0.31622777],
        [ 0.31622777, -0.9486833 ]])
Run Code Online (Sandbox Code Playgroud)

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

u, s, vh = np.linalg.svd(C)
vh
matrix([[ 0.31622777,  0.9486833 ],
        [ 0.9486833 , -0.31622777]])
Run Code Online (Sandbox Code Playgroud)

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

我这样做并正确理解了吗?

NOh*_*Ohs 7

因为linalg.eig您的特征值存储在w. 这些是:

>>> w
array([20., 80.])
Run Code Online (Sandbox Code Playgroud)

对于奇异值分解,您可以通过对奇异值求平方来获得特征值(C是可逆的,所以这里的一切都很简单):

>>> s**2
array([80., 20.])
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,他们的顺序被颠倒了。

linalg.eig文档:

特征值不一定是有序的

linalg.svd文档:

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

通常,为您提供特征值和特征向量的例程不一定按照您可能想要的方式对它们进行“排序”。所以确保你有你想要的特征值的特征向量总是很重要的。如果您需要对它们进行排序(例如按特征值大小),您可以随时自己完成(请参阅此处:在 python 中使用 numpy.linalg.eig 后对特征值和相关特征向量进行排序)。

最后请注意,该vh包含的特征向量,而在v它的

所以这意味着例如:

>>> v[:,0].flatten()
matrix([[-0.9486833 ,  0.31622777]])
>>> vh[1].flatten()
matrix([[ 0.9486833 , -0.31622777]])
Run Code Online (Sandbox Code Playgroud)

给你两个 Eigenvalue 的特征向量20