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)
怎么了?
首先,(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 = 2,vec = [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 = 2,vec = [0, 1]。相反,我们还可以得到另外一对:val = 2,vec = [0, -1]。
因此,我们期望一个特征向量并得到两个……甚至可能吗?
作为健全性检查,请注意,[0, -1]这也将是2x2输入的特征向量:
| 2. 0.| x | 0| ==> [0, -2t] == 2 * [0, -1]
| 1. 2.| |-t|
Run Code Online (Sandbox Code Playgroud)
当然,这相当于val = -2,vec = [0, 1],所以这是相同的特征向量。
那么为什么要numpy.linalg.eig给出两个输出特征向量[0, -1]且[0, 1]特征值相同的2呢?他们是同一回事!
概括地说,np.linalg.eig一个MxM矩阵是保证总是返回M特征值和特征向量。
但是,我们可以做得更好。如果那是唯一的规则,它可以找到一个然后返回它的各种倍数。
eig选择要返回的特征向量/值?通常,任何给定的矩阵都有无数个特征向量,但是它们都具有关系A * x = lambda * x。
因此,要使程序给出有用的输出,就需要设置一些限制。否则,它将需要返回无数个不同但非常相似的结果。
关键是如何np.linalg.eig定义输出:
好的,由于输入为2x2,因此我们将获得2个特征值和2个特征向量,并且如果可能的话,将获得正交特征向量。此外,特征向量将具有单位长度,从而限制了我们获得的特征值。
但是,在这种情况下,没有两个独立的特征向量。
我们看到的是上述第四条规则正在起作用。该文档指出:
特征向量的数组v可能不会具有最大秩,也就是说,某些列可能是线性相关的,尽管舍入误差可能会掩盖这一事实。如果特征值都不同,则理论上特征向量是线性独立的。
我们知道可以保证产生2个特征向量。从上面的文本中,我们可以推断出,如果它们实际上是相同的向量,将通过使特征值相同来表明这一点。
因此,在这种情况下,我们有一个2x2矩阵,其特征值/向量为2和[0, 1]:
如果特征值必须是相同的,并且本征向量必须有一个的单位长度,则唯一的其他有效的组合是val = 2,vec=[0, -1]。