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

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

我做的和理解的是否正确?

最佳答案

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

关于python - NumPy:为什么 np.linalg.eig 和 np.linalg.svd 给出不同的 SVD V 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56736928/

相关文章:

Python:给定 UTC 中的当前时间,您如何确定特定时区中一天的开始和结束时间?

python - 计算 lambda 函数中上述出现的次数

javascript - 如何使用不变的 URL 抓取多个页面 - Python 3

python - pygame中的动画

计算 Pandas 数据框中条纹的Pythonic方法

python - numpy 数组按向量划分列

python - 从 numpy 结构化数组中的数据打印行

r - 将一个数字更改为 R 中另一个数字的整数倍?

c++ - uBLAS 慢速矩阵-稀疏 vector 乘法

matrix - 稀疏矩阵的实际应用