1.1 特征分解(谱分解)——只可以用在方阵上
1.1.1 特征分解的原理
如果说一个向量 是方阵
的特征向量,将一定可以表示成下面的形式:
(1-1)
·这种形式在数学上的含义:描述的是矩阵 对向量 的变换效果只有拉伸,没有旋转。(因为 这个值是一个数值)
·这时候 就被称为特征向量
对应的特征值
也可以看成矩阵 ,向量
,系数
这三者建立了一种联系,但显然我们无法通过式(1-1)来用
和
表示
,因为这个式子不是完备的,对于一个秩为m的矩阵
,应该存在m个这样的式子,完备式子应该是:
(1-2)
根据公式(1-2)就可以得到矩阵 的特征分解公式:
(1-3)
- 矩阵的一组特征向量
是一组正交向量。
- 其中
是这个矩阵
的特征向量组成的矩阵,
是一个对角阵,每一个对角线上的元素就是一个特征值。
总结:特征分解,可以得到m个特征向量和特征值,利用这m个特征(代表这个矩阵最重要的特征),就可以近似这个矩阵。
1.1.2特征分解的合理性
一个矩阵和该矩阵的非特征向量相乘是对该向量的旋转变换;一个矩阵和该矩阵的特征向量相乘是对该向量的伸缩变换,其中伸缩程度取决于特征值大小。
矩阵在特征向量所指的方向上具有 增强(或减弱)特征向量 的作用。这也就是说,如果矩阵持续地叠代作用于向量,那么特征向量的就会突显出来,利用python进行计算:
•首先举一个例子,假设矩阵 和向量
:
用矩阵 去反复左乘一个
向量,python代码如下:
import numpy as npimport copyA = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]])V = np.array([[-1], [5], [3]])dot_nums = [1, 3, 5, 10]for i in range(len(dot_nums)):
A_ = copy.copy(A)
for _ in range(dot_nums[i] - 1):
A_ = np.dot(A_, A)
B = np.dot(A_, V)
B = np.abs(B)
C = B / np.sum(B)
print("dot number: %d" % dot_nums[i])
print(C)
得到结果:
可以看到不断左乘后,变换后的归一化向量在(0.33,0.2,0.46)附近徘徊,这与计算出来的最大特征值对应的特征向量归一化后的结果是一致的,这也就佐证了矩阵是具有某种不变的特性的。因此为了提取矩阵这种“不变性”,或者说是为了描述变换(矩阵惩罚是一种线性变换)的主要方向是非常有必要的。
1.1.3 特征分解的计算
在 (1-1) 式的基础上,进行一些变形 :
(1-4)
根据线性方程组理论,为了使这个方程有非零解,矩阵 的行列式必须是零:
(1-5)
上式也被称为是 的特征方程,计算出所有
的取值后,再代入
求解对应的
。
注意:要注意特征值是重根时的情况。
(1)手算
求矩阵$A$的特征值和特征向量:
可以得到结果:
当 时,
当 时,
当 时,
(2)python计算
使用python中自带的库eig,其中 为特征向量矩阵,
为特征值,
中的列是对应的每一个特征向量
import numpy as npimport copyA = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]])D, V = np.linalg.eig(A)if np.equal(np.dot(A, V), np.dot(V, np.diag(D))):
print(True)
结果为
发现python计算的和手算的特征向量值不同,但比例是一样的,这是因为特征向量不是唯一的,特征向量来自齐次线性方程组的解,是齐次线性方程组的基础解系的非零线性组合。
1.1.4 对称矩阵的特征分解(这个性质后面SVD推导用到)
定理:假设矩阵$A$是一个对称矩阵,则其不同特征值对应的特征向量两两正交。
证明:
首先进行特征分解:
在公式(2-6)左乘 :
因为矩阵A是一个对称矩阵,可以对式(1-8)的左边做如下变换:
最后通过(2-9)可以得到:
因为 , 必然等于0。由于
和
是矩阵
的任意两个特征向量,所以命题得证。