python - 抑制可忽略不计的复杂 numpy 特征值?
问题描述
我正在计算协方差矩阵的特征值,它是实数和对称正半定的。因此,特征值和特征向量都应该是实数,但是numpy.linalg.eig()
会返回具有(几乎)零虚部的复数值。
协方差矩阵太大,无法在此处发布,但特征值显示为
[1.38174e01+00j, 9.00153e00+00j, ....]
向量中的最大虚部在 处可以忽略不计-9.7557e-16j
。
我认为这里存在一些机器精度问题,因为很明显虚部可以忽略不计(并且考虑到我的协方差矩阵是实数 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返回数字的实部。
推荐阅读
- javascript - 我们如何确定图像是否被 JavaScript 修改/操作
- java - JavaFX:在 TableView 的同一单元格中添加文本和进度条
- c++ - 任何用 constexpr string_view 替换全局 const char[] 的陷阱?
- django - 使用模板标签获取模板内的集合
- ruby-on-rails - state_machines 在转换回调后跳过
- c# - 使用 WebClient 获取网页 HTML
- php - 如何在 PHP 中将对象添加到具有特定对象的数组中?
- robotframework - 如何使用 RobotFrameWork 测试两个日期是否不同
- c# - TT 转换在加载 EnvDTE 时失败。_Solution
- git - 我编辑了一条旧的提交消息,但 git log 显示编辑后的提交日期较旧,高于最近创建的提交