【发布时间】:2019-09-22 09:42:13
【问题描述】:
我有一个矩阵M,其中M.shape = (679, 512)。
我想找到M M^T的特征向量和特征值,它是协方差矩阵,在数学上应该是正定的。我发现他们使用:
import numpy as np
v, w = np.linalg.eig(np.matmul(M, M.T))
但是,出于某种原因,我将特征值/特征向量视为:
>>> v
array([ 1.17577206e+10+0.0000000e+00j, 1.05090161e+10+0.0000000e+00j,
7.01098189e+09+0.0000000e+00j, 5.19451802e+09+0.0000000e+00j,
...
1.03985971e-12+0.0000000e+00j, -3.04194468e-13+6.9097571e-13j,
-3.04194468e-13-6.9097571e-13j, 1.77363116e-13+0.0000000e+00j,
-1.20885913e-13+0.0000000e+00j, -4.95627438e-14+0.0000000e+00j,
-1.56456859e-16+0.0000000e+00j], dtype=complex64)
这怎么可能? M M^T 不应该是半正定的,只给出正的和实的特征值吗?怎么可能得到非实特征值?
def is_positive_def(x):
return np.all(np.linalg.eigvals(x) > 0)
【问题讨论】:
-
我真的不知道确切的答案,但鉴于所有负值都非常小,我强烈怀疑这与数值舍入问题有关。
-
最小特征值为
(-284.69064+0j) -
你能在问题中添加一个示例矩阵吗?您显示的所有负特征值都非常小,我在尝试使用
np.random.randn(630,512)生成的随机数组时得到了相同的结果。 -
@user545424 编辑很大而且有问题,但这里是文件 - drive.google.com/file/d/15YSKCDIohJYrBXMw8pFiVXaOa2qYRZ07/…,可以使用
np.load加载 -
如果你能用易于创建的东西(即使用
np.random或其他东西)重现它,那就太好了。对你的问题的简短回答是,如果你知道你的矩阵是对称的,你应该使用np.eigh。
标签: numpy linear-algebra