Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
numpy.cov或numpy.linalg.eigvals给出了错误的结果_Numpy_Covariance - Fatal编程技术网

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

numpy.cov或numpy.linalg.eigvals给出了错误的结果,numpy,covariance,Numpy,Covariance,我有高(100)维数据。我想得到数据协方差矩阵的特征向量 Cov = numpy.cov(data) EVs = numpy.linalg.eigvals(Cov) 我得到一个向量,它包含一些复数特征值。这在数学上是不可能的。诚然,复数的虚部非常小,但它在以后仍然会引起问题。这是一个数字问题吗?如果是,问题在于cov、eigvals功能还是两者都有 为了给它更多的色彩,我在Mathematica做了同样的计算,当然,这给出了一个正确的结果。事实证明,有些特征值非常接近零,但不是安静的零,nu

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

Cov = numpy.cov(data)
EVs = numpy.linalg.eigvals(Cov) 
我得到一个向量,它包含一些复数特征值。这在数学上是不可能的。诚然,复数的虚部非常小,但它在以后仍然会引起问题。这是一个数字问题吗?如果是,问题在于cov、eigvals功能还是两者都有


为了给它更多的色彩,我在Mathematica做了同样的计算,当然,这给出了一个正确的结果。事实证明,有些特征值非常接近零,但不是安静的零,numpy把所有这些都弄错了(从大小上看,这使其中一些变成了复数)

我面临着一个类似的问题:返回一个复向量,其中虚部处处都是准零

使用而不是为我修复它。

我不知道确切的原因,但很可能这是一个数字问题,
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)))

我面临着一个类似的问题:返回一个复向量,其中虚部处处为准零

使用而不是为我修复它。

我不知道确切的原因,但很可能这是一个数字问题,
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)))

对hermitian使用
numpy.linalg.eigh
matrices@Stelios. 这会返回负的特征值,所以也是错误的。我已经有了正确的结果,我的问题更多的是关于numpy哪里错了。我的原始问题中的两行代码不应该导致任何虚部与零完全不同的东西。如果输入协方差矩阵,则无论协方差矩阵有多小,EIH都不应返回负特征值。那么cov、EIG、eigvals或所有这些问题在哪里呢?问题一定在于
eiG
eigvals
功能。进行奇异值分解
u,s,v=numpy.linalg.svd(cov)
会给出正确的结果。仍然在想为什么“eigh”和“eigvals”有数字问题。这一定是一个数字问题。我怀疑负特征值非常小(阶数为10**-15),您可以手动将其设置为零。如果您能提供一个可复制的示例代码,这会有所帮助。请为hermitian使用
numpy.linalg.eigh
matrices@Stelios. 这会返回负的特征值,所以也是错误的。我已经有了正确的结果,我的问题更多的是关于numpy哪里错了。我的原始问题中的两行代码不应该导致任何虚部与零完全不同的东西。如果输入协方差矩阵,则无论协方差矩阵有多小,EIH都不应返回负特征值。那么cov、EIG、eigvals或所有这些问题在哪里呢?问题一定在于
eiG
eigvals
功能。进行奇异值分解
u,s,v=numpy.linalg.svd(cov)
会给出正确的结果。仍然在想为什么“eigh”和“eigvals”有数字问题。这一定是一个数字问题。我怀疑负特征值非常小(阶数为10**-15),您可以手动将其设置为零。如果您能提供一个可复制的示例代码,这将有所帮助。