抑制可忽略不计的复杂 numpy 特征值?
Suppress negligible complex numpy eigenvalues?
我正在计算协方差矩阵的特征值,它是实数和对称半正定矩阵。因此,特征值和特征向量都应该是实数,但是 numpy.linalg.eig()
返回的是具有(几乎)零虚部的复数值。
这里的协方差矩阵太大了post,但是特征值是
[1.38174e01+00j, 9.00153e00+00j, ....]
矢量中最大的虚部在 -9.7557e-16j
处可以忽略不计。
我认为这里存在一些机器精度问题,因为虚部显然可以忽略不计(并且假设我的协方差矩阵是 real pos semi-def)。
有没有办法使用 numpy eig(或 scipy)抑制返回虚部?我试图避免使用 if 语句来检查特征值对象是否复杂,然后尽可能将其设置为实数分量。
我认为针对此特定案例的最佳解决方案是使用@PaulPanzer 的建议,即np.linalg.eigh。这直接适用于 Hermitian 矩阵,因此只有真实的特征值,正是这个特定的用例。
一般来说,检索数组中数字的实部非常简单:
>>> np.real(np.array([1+1j,2+1j]))
array([ 1., 2.])
numpy.real returns 你的数字的实部。
我正在计算协方差矩阵的特征值,它是实数和对称半正定矩阵。因此,特征值和特征向量都应该是实数,但是 numpy.linalg.eig()
返回的是具有(几乎)零虚部的复数值。
这里的协方差矩阵太大了post,但是特征值是
[1.38174e01+00j, 9.00153e00+00j, ....]
矢量中最大的虚部在 -9.7557e-16j
处可以忽略不计。
我认为这里存在一些机器精度问题,因为虚部显然可以忽略不计(并且假设我的协方差矩阵是 real pos semi-def)。
有没有办法使用 numpy eig(或 scipy)抑制返回虚部?我试图避免使用 if 语句来检查特征值对象是否复杂,然后尽可能将其设置为实数分量。
我认为针对此特定案例的最佳解决方案是使用@PaulPanzer 的建议,即np.linalg.eigh。这直接适用于 Hermitian 矩阵,因此只有真实的特征值,正是这个特定的用例。
一般来说,检索数组中数字的实部非常简单:
>>> np.real(np.array([1+1j,2+1j]))
array([ 1., 2.])
numpy.real returns 你的数字的实部。