我有高(100)维数据。我想获得数据协方差矩阵的特征向量。
Cov = numpy.cov(data)
EVs = numpy.linalg.eigvals(Cov)
我得到一个包含一些复数的特征值的向量。这在数学上是不可能的。当然,复数的虚部非常小,但后来仍然会引起问题。这是一个数字问题吗?如果是这样,问题在于cov,eigvals功能还是两者兼而有之?
为了给它更多的颜色,我在Mathematica中进行了相同的计算,当然,这给出了正确的结果。事实证明有一些特征值非常接近于零而不是安静的零和numpy得到所有这些错误(大小明智,它使其中一些变成复数)
答案 0 :(得分:0)
我正面临着类似的问题:np.linalg.eigvals
返回的复矢量中,虚部在各处都是准零的。
使用np.linalg.eigvalsh
代替它为我修复。
我不知道确切的原因,但是很可能这是一个数字问题,eigvalsh
似乎可以解决,而eigvals
却没有。请注意,实际特征值的顺序可能会有所不同。
以下代码段说明了解决方法:
import numpy as np
from numpy.linalg import eigvalsh, eigvals
D = 10
MUL = 100
EPS = 1e-8
x = np.random.rand(1, D) * MUL
x -= x.mean()
S = np.matmul(x.T, x) + I
# adding epsilon*I avoids negative eigenvalues due to numerical error
# since the matrix is actually positive semidef. (useful for cholesky etc)
S += np.eye(D, dtype=np.float64) * EPS
print(sorted(eigvalsh(S)))
print(sorted(eigvals(S)))