Numpy eig/eigh给出了对称半正定矩阵的负值
GCN后CIFAR数据集的以下代码:Numpy eig/eigh给出了对称半正定矩阵的负值,numpy,linear-algebra,eigenvalue,Numpy,Linear Algebra,Eigenvalue,GCN后CIFAR数据集的以下代码: xtx = np.dot(dataset.train_data[i].transpose(), dataset.train_data[i]) e, q = np.linalg.eigh(xtx) print(np.max(e), np.min(e)) 生成以下输出: 2.65138e+07 -0.00247511 这是不一致的,因为xtx是对称半正定的。我的猜测是,这可能是由于早期应用了GCN,但最小特征值甚至没有接近0 更新:所以我的矩阵的条件号是8.
xtx = np.dot(dataset.train_data[i].transpose(), dataset.train_data[i])
e, q = np.linalg.eigh(xtx)
print(np.max(e), np.min(e))
生成以下输出:
2.65138e+07 -0.00247511
这是不一致的,因为xtx
是对称半正定的。我的猜测是,这可能是由于早期应用了GCN,但最小特征值甚至没有接近0
更新:所以我的矩阵的条件号是8.89952e+09。事实上,我之前忘记了取平均值,所以现在最大特征值是~573,而最小值是-7.14630133e-08。我的问题是我正在尝试做ZCA。在这种情况下,我应该如何进行?将对角石化添加到
xtx
或特征值?什么是xtx
的数据类型(检查xtx.dtype
)?当你认为最大值和最小特征值之间有10个数量级时,它会非常接近于零,因为@ WarrenWeckesser指出,这对于32位浮点(平均7-9位数的精度)来说是在误差范围之内的,请同时发布<代码> NUPY.LIALG.COND的结果。(xtx)@maxymoo,您假设所有特征值都具有相同的精度,这当然取决于eigh
的工作方式。我对此表示怀疑,并尝试在lapack代码中快速找到这一点,但没有成功。我已更新了问题