NumPy:为什么 np.linalg.eig 和 np.linalg.svd 给出不同的 SVD V 值?
NumPy: why does np.linalg.eig and np.linalg.svd give different V values of SVD?
我正在学习SVD by following this MIT course。
矩阵构造为
C = np.matrix([[5,5],[-1,7]])
C
matrix([[ 5, 5],
[-1, 7]])
讲师给出的V为
这接近
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向量中的元素,可以接受吗?
我做的和理解的是否正确?
对于 linalg.eig
,您的特征值存储在 w
中。它们是:
>>> w
array([20., 80.])
对于奇异值分解,您可以通过对奇异值求平方来获得特征值(C
是可逆的,所以这里一切都很简单):
>>> s**2
array([80., 20.])
如您所见,他们的订单被翻转了。
来自 linalg.eig 文档:
The eigenvalues are not necessarily ordered
来自 linalg.svd 文档:
Vector(s) with the singular values, within each vector sorted in descending order. ...
在为您提供特征值和特征向量的一般例程中,不一定 "sort" 它们会以您想要的方式出现。因此,确保您拥有所需特征值的特征向量始终很重要。如果您需要对它们进行排序(例如按特征值大小),您可以随时自己进行排序(参见此处: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
。
我正在学习SVD by following this MIT course。
矩阵构造为
C = np.matrix([[5,5],[-1,7]])
C
matrix([[ 5, 5],
[-1, 7]])
讲师给出的V为
这接近
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向量中的元素,可以接受吗?
我做的和理解的是否正确?
对于 linalg.eig
,您的特征值存储在 w
中。它们是:
>>> w
array([20., 80.])
对于奇异值分解,您可以通过对奇异值求平方来获得特征值(C
是可逆的,所以这里一切都很简单):
>>> s**2
array([80., 20.])
如您所见,他们的订单被翻转了。
来自 linalg.eig 文档:
The eigenvalues are not necessarily ordered
来自 linalg.svd 文档:
Vector(s) with the singular values, within each vector sorted in descending order. ...
在为您提供特征值和特征向量的一般例程中,不一定 "sort" 它们会以您想要的方式出现。因此,确保您拥有所需特征值的特征向量始终很重要。如果您需要对它们进行排序(例如按特征值大小),您可以随时自己进行排序(参见此处: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
。