抑制可忽略不计的复杂 numpy 特征值?

2024-01-17

我正在计算协方差矩阵的特征值,该矩阵是实数且对称正半定的。因此,特征值和特征向量应该都是实数,但是numpy.linalg.eig() https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html返回虚部(几乎)为零的复数值。

协方差矩阵太大,无法在此处发布,但特征值如下

[1.38174e01+00j, 9.00153e00+00j, ....]

向量中最大的虚部可以忽略不计-9.7557e-16j.

我认为这里存在一些机器精度问题,因为显然虚部可以忽略不计(并且考虑到我的协方差矩阵是实数正半定义)。

有没有办法抑制使用 numpy eig (或 scipy)返回虚部?我试图避免使用 if 语句来检查特征值对象是否复杂,然后仅将其设置为真实组件(如果可能)。


我认为针对这种具体情况的最佳解决方案是使用@PaulPanzer的建议,即np.linalg.eigh https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html。这直接适用于埃尔米特矩阵,因此只有真实的特征值,正是这个特定的用例。


一般来说,检索数组中数字的实部非常简单:

>>> np.real(np.array([1+1j,2+1j]))
array([ 1.,  2.])

numpy.real https://docs.scipy.org/doc/numpy/reference/generated/numpy.real.html返回数字的实部。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抑制可忽略不计的复杂 numpy 特征值? 的相关文章

随机推荐