使用linalg找到特征向量

时间:2015-09-30 17:04:15

标签: python numpy scipy

我使用numpy的linalg.eig来找到特征值和矩阵向量。 下面的矩阵有一个形式为(t,0)的特征向量。但是python给了我不同的结果:

>>> a = np.matrix('2. 0. ; 1. 2.')
>>> print np.linalg.eig(a)
(array([ 2.,  2.]), matrix([[  0.00000000e+00,   4.44089210e-16],
        [  1.00000000e+00,  -1.00000000e+00]]))

有什么问题?

1 个答案:

答案 0 :(得分:4)

我们会期待什么?

首先,(t, 0)不是输入矩阵的特征向量:

   | 2.  0.| x |t|  ==> [2t, t]
   | 1.  2.|   |0|

与之对比:

   | 2.  0.| x |0|  ==> [0, 2t] == 2 * [0, t]
   | 1.  2.|   |t|

好的,val = 2vec = [0, 1]会有意义,就像它的乘数一样。

舍入错误

接下来,请记住eig使用迭代近似解决方案,因为对于> 3x3输入,特征向量的分析解决方案是不可能的。因此,您可以忽略这样一个事实,即您的特征向量中的一个值并非完全为零。

您的输出基本上是:

eigs = [2, 2]
vecs = [[0,  0],
        [1, -1]]

请注意,eig的各个特征向量位于列中,而不是行中。换句话说,我们得到2的两个相同的特征值和[0, 1][0, -1]的两个特征向量。

只能有一个!

正如@WarrenWeckesser指出的那样,这是一个defective matrix,尽管是2x2,它只有一个特征向量。

因此,从数学上讲,我们期望val = 2vec = [0, 1]。相反,我们还会得到另一对:val = 2vec = [0, -1]

所以我们期待一个特征向量并得到两个...这甚至可能吗?

等等,我们有两件相同的东西!?

作为一个完整性检查,请注意[0, -1]也将是您的2x2输入的特征向量:

   | 2.  0.| x | 0|  ==> [0, -2t] == 2 * [0, -1]
   | 1.  2.|   |-t|

当然,这相当于val = -2vec = [0, 1],所以它是相同的特征向量。

那么为什么numpy.linalg.eig给出两个具有相同特征值2的输出特征向量[0, -1][0, 1]?他们是一回事!

简而言之,np.linalg.eig矩阵的MxM保证始终返回M特征值和向量。

然而,我们可以做得更好一些。如果这是唯一的规则,它可以找到一个,然后返回它的各种倍数。

eig如何选择要返回的特征向量/值?

通常,对于任何给定矩阵,存在无限数量的特征向量,但它们都具有A * x = lambda * x的关系。

因此,要让程序提供有用的输出,我们需要设置一些限制。否则,它将需要返回无数个不同但非常相似的结果。

关键是如何定义np.linalg.eig的输出:

  1. 输出特征向量的数量等于输入的大小(即3或3x3,4x4等4)。
  2. 特征向量将具有单位长度。
  3. 如果可能,输出特征向量将是正交的
  4. 如果没有适当数量的正交特征向量,则线性相关特征向量的特征值将是相同的。
  5. 遵守规则

    好的,所以我们要获得2个特征值和两个特征向量作为输入是2x2,并且如果可能的话我们将得到正交的特征向量。此外,特征向量将具有单位长度,限制我们得到的特征值。

    然而,在这种情况下,没有两个独立的特征向量。

    我们所看到的是上面的第四条规则。文档说明:

      

    特征向量的数组v可能不是最大等级,即一些   尽管可能是舍入误差,但列的线性可能是线性相关的   掩盖了这个事实。如果特征值都不同,那么   从理论上讲,特征向量是线性无关的。

    我们知道可以保证产生2个特征向量。从上面的文字我们可以推断,如果它们实际上是相同的向量,这将通过使特征值相同来表示。

    所以在这种情况下,我们有一个2x2矩阵,其中一个特征值/向量为2[0, 1]

    如果特征值必须相同且特征向量的单位长度必须为1,则唯一的其他有效组合为val = 2vec=[0, -1]