协方差矩阵的特征值为负

数据挖掘 Python 统计数据 主成分分析
2022-03-06 13:00:13

我正在研究 mnist 数据集的 PCA,我得到了一个非常奇怪的结果,我创建了一个矩阵,其行是扁平的 mnist 图像,当我尝试计算协方差矩阵的特征值时,我得到了一些负值。但是协方差矩阵是半正定的。

np.linalg.eigvals(np.dot(mnistBis[:, 0:20].T, mnistBis[:, 0:20])) # mnistBis.shape=(60000, 784)
array([ 4.79599869e+02, -1.19628465e+02,  9.68398702e+01,  1.88726171e-01,
        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00,
        0.00000000e+00,  0.00000000e+00,  0.00000000e+00,  0.00000000e+00])

修改: 这是完整的代码

import tensorflow.keras.datasets.mnist as mnist
import matplotlib.pyplot as plt
import numpy as np

(x_train, y_train), (x_test, y_test) = mnist.load_data()
mnistBis = np.reshape(x_train, (-1, 28*28))
np.linalg.eigvalsh(np.dot(mnistBis[:, 0:20].T, mnistBis[:, 0:20]))

```
2个回答

这可能是浮点错误的结果。

矩阵为 60,000 x 20 且稀疏(大部分为零)。计算结果是非常接近于零的值,计算机无法正确表示。

您似乎正在使用通用特征值求解器。也许您的矩阵条件很差,并且算法无法拾取它。大量零特征值和少量大特征值当然看起来很可疑。您是否尝试过专门针对厄米特/对称矩阵的求解器?& eigvalsh

此外,我会对你的所有特征进行 z 评分,并删除所有方差为零的特征。这将设置最大可能特征值的上限,因为矩阵的轨迹将是特征的数量,并且由于正定矩阵只有正特征值,因此最大特征值不会大于轨迹。