在开始之前,我们先看有一组例子:
我们若有矩阵A: ,和一个向量v
, 若我们不断用矩阵A来左乘v,输出的结果会有什么样的特点呢?我们来看看:
我们看看用矩阵A左乘四次的向量可视化出来是什么的结果:
蓝色是向量v,黑色是向量v不断用矩阵A左乘出来的向量。我们可以看到,左乘出来的向量会不断接近一个向量方向,这个方向,就是矩阵A的特征向量的方向。蓝色是向量v。红色是计算出来的特征向量。
如上图所示的两条红色向量,把他们无限延长,会形成一个“X”,这个红色的X就是所谓的矩阵的特征空间。
看到这里也许有同学会问,特征向量是两条,为什么只会不断拟合其中一条?因为这是跟特征向量对应的特征值有关的,用矩阵不断乘一个向量,只会拟合到特征值最大的特征向量。
然后我们来看看特征向量和特征值的关系:
若矩阵A与它的特征向量v相乘,那么就会完全等于A的特征值与A的特征向量相乘。(特征值为常数)
所以对于一个矩阵而言,它的特征值和特征向量是它的本质。我们看一下下图:
红色向量为矩阵A的特征向量v,黑色向量为矩阵A乘A的特征向量Av。
那么综合上面所有信息我们可以知道:
任意一个向量v,它经过数次与矩阵A相乘,得到的向量Av会几乎和矩阵A的特征向量方向相同。这时候,可以把Av看作A的特征向量,那么再继续用矩阵A乘的时候,得到的向量方向就不变了,变化的只有长度,长度为原来的长度乘特征值。
实验:
用特征值为2的矩阵A,不断左乘某个向量b,看看得到向量的长度是不是2的倍数:
A = np.array([ #特征值为2
[2,0],
[0,2]
])
eigenvalue,featurevector=np.linalg.eig(A)
print(eigenvalue)
b = np.array([
[2],
[1]
])
b = np.matmul(A,b)
print(np.sqrt(b[0]**2+b[1]**2)) #[4.47213595]
b = np.matmul(A,b)
print(np.sqrt(b[0]**2+b[1]**2)) #[8.94427191]
b = np.matmul(A,b)
print(np.sqrt(b[0]**2+b[1]**2)) #[17.88854382]
b = np.matmul(A,b)
print(np.sqrt(b[0]**2+b[1]**2)) #[35.77708764]
b = np.matmul(A,b)
print(np.sqrt(b[0]**2+b[1]**2)) #[71.55417528]
我们可以看到,结论符合。所以如果矩阵A的特征值为1的话,那么不断左乘的话,得到的结果也是不会变的。
具体例子说明:
我们可以把矩阵A看作是一个运动。A表示了运动的方向(特征向量)和运动的速度(特征值)。如果一个向量b被这个矩阵A左乘,那么b就会往矩阵A所规定的方向和速度运行。A乘了b多少次,就是b以A规定的方向和速度运行了多少秒。