我使用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]]))
有什么问题?
答案 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 = 2
,vec = [0, 1]
会有意义,就像它的乘数一样。
接下来,请记住eig
使用迭代近似解决方案,因为对于> 3x3输入,特征向量的分析解决方案是不可能的。因此,您可以忽略这样一个事实,即您的特征向量中的一个值并非完全为零。
您的输出基本上是:
eigs = [2, 2]
vecs = [[0, 0],
[1, -1]]
请注意,eig
的各个特征向量位于列中,而不是行中。换句话说,我们得到2
的两个相同的特征值和[0, 1]
和[0, -1]
的两个特征向量。
正如@WarrenWeckesser指出的那样,这是一个defective matrix,尽管是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|
当然,这相当于val = -2
,vec = [0, 1]
,所以它是相同的特征向量。
那么为什么numpy.linalg.eig
给出两个具有相同特征值2的输出特征向量[0, -1]
和[0, 1]
?他们是一回事!
简而言之,np.linalg.eig
矩阵的MxM
保证始终返回M
特征值和向量。
然而,我们可以做得更好一些。如果这是唯一的规则,它可以找到一个,然后返回它的各种倍数。
eig
如何选择要返回的特征向量/值?通常,对于任何给定矩阵,存在无限数量的特征向量,但它们都具有A * x = lambda * x
的关系。
因此,要让程序提供有用的输出,我们需要设置一些限制。否则,它将需要返回无数个不同但非常相似的结果。
关键是如何定义np.linalg.eig
的输出:
好的,所以我们要获得2个特征值和两个特征向量作为输入是2x2,并且如果可能的话我们将得到正交的特征向量。此外,特征向量将具有单位长度,限制我们得到的特征值。
然而,在这种情况下,没有两个独立的特征向量。
我们所看到的是上面的第四条规则。文档说明:
特征向量的数组v可能不是最大等级,即一些 尽管可能是舍入误差,但列的线性可能是线性相关的 掩盖了这个事实。如果特征值都不同,那么 从理论上讲,特征向量是线性无关的。
我们知道可以保证产生2个特征向量。从上面的文字我们可以推断,如果它们实际上是相同的向量,这将通过使特征值相同来表示。
所以在这种情况下,我们有一个2x2矩阵,其中一个特征值/向量为2
和[0, 1]
:
如果特征值必须相同且特征向量的单位长度必须为1,则唯一的其他有效组合为val = 2
,vec=[0, -1]
。