Python特征值与特征向量
我有一个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
这句话的意思是,除了一个特征值之外,你的所有特征值都是零。我觉得你的矩阵可能不是满秩矩阵。