Python特征值与特征向量

1 投票
2 回答
2917 浏览
提问于 2025-04-18 00:44

我有一个336x336的共保矩阵,我用numpy计算了特征值和特征向量,并进行了排序。

evals, evecs = np.linalg.eig(cov)
idx = evals.argsort()   
evals = evals[idx] 
evecs = evecs[:,idx]

问题是,evals中的最后一个值和其他值相比有点奇怪。大概是这样的:

    evals[:3]
    [ -6.11117191e-19  -6.11117191e-19  -1.08420217e-19]
    evals[-3:]
    [  4.29345466e-19   7.08196415e-19   1.69419875e-02]

最高的特征值1.69419875e-02,相比其他值来说非常高。我检查了所有336个特征值,除了这个值,其他的都差不多在同一个范围内。

有人能告诉我这是为什么吗?

嗨,mrcl,感谢你的回复。我根据你建议的精度生成了8x8的协方差矩阵。现在看起来是这样的:

[[  0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00]
  [  0.00e+00   4.62e-05   9.25e-05   4.62e-05   0.00e+00  -9.25e-05  -4.62e-05  -4.62e-05]
  [  0.00e+00   9.25e-05   1.85e-04   9.25e-05   0.00e+00  -1.85e-04  -9.25e-05  -9.25e-05]
  [  0.00e+00   4.62e-05   9.25e-05   4.62e-05   0.00e+00  -9.25e-05  -4.62e-05  -4.62e-05]
  [  0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00   0.00e+00]
  [  0.00e+00  -9.25e-05  -1.85e-04  -9.25e-05   0.00e+00   1.85e-04   9.25e-05   9.25e-05]
  [  0.00e+00  -4.62e-05  -9.25e-05  -4.62e-05   0.00e+00   9.25e-05   4.62e-05   4.62e-05]
  [  0.00e+00  -4.62e-05  -9.25e-05  -4.62e-05   0.00e+00   9.25e-05   4.62e-05   4.62e-05]]

对于第一列和第一行,我不明白为什么都是零。我手动计算了这些列和行的协方差,结果也是零,可能是原始值变化不大。原始值是:

0.06  0.05  0.05  0.08  0.05  0.06  0.06  0.02

0.06  0.04  0.03  0.07  0.05  0.08  0.07  0.03

谢谢!

2 个回答

0

@新手

根据这个8x8的矩阵,我发现了一个规律,就是每隔四列或四行就会出现一整行或一整列都是零的情况。只要矩阵里有一整行或一整列是零,这个矩阵的行列式就会变成零,这样的矩阵叫做奇异矩阵,也就是说你的协方差矩阵没有逆矩阵。在这种情况下,返回的特征值和通过奇异值分解(SVD)得到的奇异值是一样的。

我建议你再仔细检查一下,看看为什么你的协方差矩阵计算出来会出现整行整列都是零的情况,甚至在主对角线上也有。

希望这对你有帮助。

1

这句话的意思是,除了一个特征值之外,你的所有特征值都是零。我觉得你的矩阵可能不是满秩矩阵。

撰写回答