【问题标题】:Eigenvectors computed with numpy's eigh and svd do not match用 numpy 的 eigh 和 svd 计算的特征向量不匹配
【发布时间】:2015-03-03 03:05:55
【问题描述】:

考虑奇异值分解 M=USV*。然后 M* M 的特征值分解得到 M* M= V (S* S) V*=VS* U* USV*。我希望通过证明eigh 函数返回的特征向量与svd 函数返回的特征向量相同来验证这种相等性:

import numpy as np
np.random.seed(42)
# create mean centered data
A=np.random.randn(50,20)
M= A-np.array(A.mean(0),ndmin=2)

# svd
U1,S1,V1=np.linalg.svd(M) 
S1=np.square(S1)
V1=V1.T  

# eig
S2,V2=np.linalg.eigh(np.dot(M.T,M))
indx=np.argsort(S2)[::-1]
S2=S2[indx]
V2=V2[:,indx]

# both Vs are in orthonormal form
assert np.all(np.isclose(np.linalg.norm(V1,axis=1), np.ones(V1.shape[0])))
assert np.all(np.isclose(np.linalg.norm(V1,axis=0), np.ones(V1.shape[1])))
assert np.all(np.isclose(np.linalg.norm(V2,axis=1), np.ones(V2.shape[0])))
assert np.all(np.isclose(np.linalg.norm(V2,axis=0), np.ones(V2.shape[1])))

assert np.all(np.isclose(S1,S2))
assert np.all(np.isclose(V1,V2))

最后一个断言失败。为什么?

【问题讨论】:

  • 你可以给所有的对角元素加上一个正数,即使 M2=M+a*I,其中 a 大到足以使 M2 为半正数。那么 SVD 和 eigh 应该更一致。

标签: python numpy svd eigenvector


【解决方案1】:

只需使用小数字来调试您的问题。

A=np.random.randn(3,2) 开始,而不是更大的矩阵(50,20)

在我的随机案例中,我发现

v1 = array([[-0.33872745,  0.94088454],
   [-0.94088454, -0.33872745]])

对于v2

v2 = array([[ 0.33872745, -0.94088454],
   [ 0.94088454,  0.33872745]])

它们仅在符号上有所不同,显然,即使归一化为具有单位模块,向量也可能因符号而异。

现在如果你尝试这个技巧

assert np.all(np.isclose(V1,-1*V2))

对于您原来的大矩阵,它失败了......再次,这没关系。发生的情况是,一些向量已乘以 -1,而另一些则没有。

检查向量之间是否相等的正确方法是:

assert allclose(abs((V1*V2).sum(0)),1.)

事实上,要了解它的工作原理,您可以打印这个数量:

(V1*V2).sum(0)

这确实是+1-1,具体取决于向量:

array([ 1., -1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1., -1.,  1.,  1.,  1., -1., -1.])

编辑:这在大多数情况下都会发生,尤其是从随机矩阵开始时。但是请注意,如果一个或多个特征值的特征空间的维度大于1,则此测试可能会失败,正如@Sven Marnach 在下面的评论中指出的那样:

除了向量乘以 -1 之外,可能还有其他差异。 如果任何特征值具有多维特征空间,则 可能会得到该特征空间的任意正交基,并且 这样的基地可能会通过任意性相互轮换 一元矩阵

【讨论】:

  • @matus 好的,我迷路了 :) 但我相信你的判断,所以我会删除我的 cmets,以免让未来的读者感到困惑。干杯!
  • 除了向量乘以 -1 之外,可能还有其他差异。如果任何特征值具有多维特征空间,您可能会得到该特征空间的任意正交基,并且这些基可能会通过任意一元矩阵相互旋转。
  • @SvenMarnach,这是一个非常有效的观点。我将编辑帖子以指出这一警告
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 2023-03-08
  • 2021-12-01
  • 1970-01-01
  • 2019-05-23
  • 2020-11-07
相关资源
最近更新 更多