当前位置: 首页 > 面试题库 >

scipy.linalg.eig返回协方差矩阵的复特征值?

洪星文
2023-03-14
问题内容

协方差矩阵的特征值应为实数且为非负值,因为协方差矩阵是对称且为半正定的。

但是,请看下面的scipy实验:

>>> a=np.random.random(5)
>>> b=np.random.random(5)
>>> ab = np.vstack((a,b)).T
>>> C=np.cov(ab)
>>> eig(C)
7.90174997e-01 +0.00000000e+00j,
2.38344473e-17 +6.15983679e-17j,
2.38344473e-17 -6.15983679e-17j,
-1.76100435e-17 +0.00000000e+00j,   
5.42658040e-33 +0.00000000e+00j

但是 ,在Matlab中重现上述示例可以正常工作:

a = [0.6271, 0.4314, 0.3453, 0.8073, 0.9739]
b = [0.1924, 0.3680, 0.0568, 0.1831, 0.0176]
C=cov([a;b])
eig(C)
-0.0000
-0.0000
 0.0000
 0.0000
 0.7902

问题答案:

您提出了两个问题:

  1. 返回的特征值scipy.linalg.eig不是实数。
  2. 一些特征值是负的。

这两个问题都是由截断和舍入错误引入的错误的结果,而在使用浮点算术的迭代算法中总是会发生这种错误。请注意,Matlab结果也产生了负的特征值。

现在,对于问题的一个更有趣的方面:​​为什么Matlab的结果是真实的,而SciPy的结果却包含一些复杂的成分?

Matlabeig检测输入矩阵是实对称的还是Hermitian的,并在输入时使用Cholesky因式分解。请参阅文档中对自chol变量的描述。这不是在SciPy中自动完成的。eig

如果要使用利用实数对称或Hermitian矩阵结构的算法,请使用scipy.linalg.eigh。对于问题中的示例:

>>> eigh(C, eigvals_only=True)
array([ -3.73825923e-17,  -1.60154836e-17,   8.11704449e-19,
         3.65055777e-17,   7.90175615e-01])

如果四舍五入到与Matlab打印的精度相同的位数,则此结果与Matlab的结果相同。



 类似资料:
  • 我正在尝试将一种基于马氏距离的方法转换为我的代码,该方法适用于图像,必须处理时间序列。这是Matlab代码,用户将图像作为输入传递,然后首先重塑它,然后计算平均值、协方差矩阵及其逆矩阵(他使用图像大小): 这是我的代码,在这里我用Python实现了第一部分。我没有图像,但有一个时间序列,其形状是(24230,30),这就是为什么我避免了重塑部分: 如果我尝试运行它,我会得到错误: 线性误差:奇异矩

  • 本文向大家介绍numpy.linalg.eig() 计算矩阵特征向量方式,包括了numpy.linalg.eig() 计算矩阵特征向量方式的使用技巧和注意事项,需要的朋友参考一下 在PCA中有遇到,在这里记录一下 计算矩阵的特征值个特征向量,下面给出几个示例代码: 在使用前需要单独import一下 官方文档链接:http://docs.scipy.org/doc/numpy/reference/g

  • 本文向大家介绍C++ Eigen库计算矩阵特征值及特征向量,包括了C++ Eigen库计算矩阵特征值及特征向量的使用技巧和注意事项,需要的朋友参考一下 本文主要讲解利用Eigen库计算矩阵的特征值及特征向量并与Matlab计算结果进行比较。 C++Eigen库代码 计算结果: 最大最小特征值及其索引位置 Matlab 代码 Matlab计算结果 使用sort()函数对特征值排序 主成份分析以及许多

  • 本文向大家介绍python中返回矩阵的行列方法,包括了python中返回矩阵的行列方法的使用技巧和注意事项,需要的朋友参考一下 实例如下所示: 以上这篇python中返回矩阵的行列方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我用的是Eigen v3。2.7. 我有一个中等大小的矩形矩阵(170x17)和行向量(170x1),我正试图用本征函数求解它们。Octave使用很好地解决了这个问题,但是Eigen为这些矩阵返回了不正确的值(但不是较小的值)-但是我怀疑这是我使用Eigen的方式,而不是Eigen本身。 根据Eigen文档,解算器适用于一般矩阵,并且非常健壮,但为了确保我也尝试过。结果是一致的。 Octave的是

  • 我在查看一些代码时发现了以下内容: 有什么区别呢?顺便说一句:我对矩阵很陌生

  • 我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。

  • 特殊矩阵——对称矩阵(Symmetric Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 对称矩阵的概念 元素以主对角线为对称轴对应相等的矩阵。 2. 对称矩阵的特性 对角矩阵都是对称矩阵,对称矩阵必须是方形矩阵