【问题标题】:NumPy: why does np.linalg.eig and np.linalg.svd give different V values of SVD?NumPy:为什么 np.linalg.eig 和 np.linalg.svd 给出不同的 SVD V 值?
【发布时间】:2019-06-24 12:46:36
【问题描述】:

我正在通过关注这个MIT course来学习SVD

矩阵构造为

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向量中的元素,可以接受吗?

我是否正确理解并理解了这一点?

【问题讨论】:

  • 我的猜测是特征值的排序顺序/奇异值是相反的

标签: python numpy linear-algebra


【解决方案1】:

对于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的特征向量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2016-05-31
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多