numpy.cov或numpy.linalg.eigvals给出了错误的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy.cov或numpy.linalg.eigvals给出了错误的结果相关的知识,希望对你有一定的参考价值。

我有高(100)维数据。我想得到数据协方差矩阵的特征向量。

Cov = numpy.cov(data)
EVs = numpy.linalg.eigvals(Cov) 

我得到一个包含一些复数的特征值的向量。这在数学上是不可能的。当然,复数的虚部非常小,但后来仍然会引起问题。这是一个数字问题吗?如果是这样,问题在于cov,eigvals功能还是两者兼而有之?

为了给它更多的颜色,我在Mathematica中进行了相同的计算,当然,这给出了正确的结果。结果发现有一些特征值非常接近于零而不是安静的零和numpy得到所有这些错误(大小明智并且它们中的一些变成复数)

答案

我面临着一个类似的问题: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)))

以上是关于numpy.cov或numpy.linalg.eigvals给出了错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

生成 numpy.MultivariateNormal 时出现 MemoryError

PCA主成分分析

PHP MySql MsSql 如何插入或更新 ['] 或 ["] 或 [`] 字符?

与、或、异或运算

jQuery 或原始 JavaScript 是不是预编译或缓存变量表达式或选择器?

QGraphicsView 或 QWidget 完成绘制或渲染时是不是存在信号或事件?