使用linalg查找特征向量

MAS*_*MAS 2 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]]))
Run Code Online (Sandbox Code Playgroud)

怎么了?

Joe*_*ton 5

我们会期待什么?

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

   | 2.  0.| x |t|  ==> [2t, t]
   | 1.  2.|   |0|
Run Code Online (Sandbox Code Playgroud)

将其与:

   | 2.  0.| x |0|  ==> [0, 2t] == 2 * [0, t]
   | 1.  2.|   |t|
Run Code Online (Sandbox Code Playgroud)

好吧,val = 2vec = [0, 1]将使意义,正如其任何倍数。


舍入误差

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

您的输出基本上是:

eigs = [2, 2]
vecs = [[0,  0],
        [1, -1]]
Run Code Online (Sandbox Code Playgroud)

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


只可以有一个人!

正如@WarrenWeckesser指出的那样,这是一个有缺陷的矩阵,尽管它是2x2,但仅具有一个特征向量。

因此,在数学上,我们会期待val = 2vec = [0, 1]。相反,我们还可以得到另外一对:val = 2vec = [0, -1]

因此,我们期望一个特征向量并得到两个……甚至可能吗?

等一下,我们有两个相同的东西!

作为健全性检查,请注意,[0, -1]这也将是2x2输入的特征向量:

   | 2.  0.| x | 0|  ==> [0, -2t] == 2 * [0, -1]
   | 1.  2.|   |-t|
Run Code Online (Sandbox Code Playgroud)

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

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

概括地说,np.linalg.eig一个MxM矩阵是保证总是返回M特征值和特征向量。

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


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

通常,任何给定的矩阵都有无数个特征向量,但是它们都具有关系A * x = lambda * x

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

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

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

遵守规则

好的,由于输入为2x2,因此我们将获得2个特征值和2个特征向量,并且如果可能的话,将获得正交特征向量。此外,特征向量将具有单位长度,从而限制了我们获得的特征值。

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

我们看到的是上述第四条规则正在起作用。该文档指出:

特征向量的数组v可能不会具有最大秩,也就是说,某些列可能是线性相关的,尽管舍入误差可能会掩盖这一事实。如果特征值都不同,则理论上特征向量是线性独立的。

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


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

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