一、特征值与特征向量简介

  特征值与特征向量是线性代数的核心内容,也是方阵的属性之一,在机器学习算法中应用十分广泛,可应用在降维、特征提取、图像压缩等领域。
  矩阵与向量相乘是对向量进行线性变换,是对原始向量同时施加方向和长度的变化。通常情况下,绝大部分向量都会被这个矩阵变换的面目全非,但是存在一些特殊的向量,被矩阵变换之后,仅有长度上的变化,用数学公式表示为 A x = λ x { Ax=\lambda}{x} Ax=λx,其中 x {x} x 为向量, λ {\lambda} λ 对应长度变化的比例,称 λ {\lambda} λ 为特征值, x {x} x λ {\lambda} λ 对应的特征向量。
  矩阵特征值与特征向量的动态意义在于变化的速度与方向,特征向量对应变化方向,而特征值对应变化速度。

二、求解特征值与特征向量

  在Numpy中通过向np.linalg.eig()函数传递方阵 A {A} A,根据np.linalg.eig()函数的返回值,得到方阵 A {A} A的特征值和特征向量。

import numpy as np
B = [[4,2], [1,5]]
A = np.array(B)
eig_val,eig_vex = np.linalg.eig(A)         #eig()函数求解特征值和特征向量
print("A的特征值为:\n",eig_val)
print("A的特征向量为:\n",eig_vex)

输出为:

A的特征值为:
 [3. 6.]
A的特征向量为:
 [[-0.89442719 -0.70710678]
 [ 0.4472136  -0.70710678]]

注意:np.linalg.eig()函数求解出的特征向量已经标准化,即满足 ∣ ∣ e i g _ v e x i ∣ ∣ = 1 {||eig\_vex_i||=1} eig_vexi=1

根据特征值生成特征矩阵 s i g m a {sigma} sigma,验证 A × e i g _ v e x = e i g _ v e x × s i g m a { A \times eig\_vex = eig\_vex \times sigma} A×eig_vex=eig_vex×sigma

sigma = np.diag(eig_val)  # 特征值的对角化
print("A × eig_vex与eig_vex × sigma是否相等:",
      np.allclose(A.dot(eig_vex),eig_vex.dot(sigma)))
print("A × eig_vex与sigma × eig_vex是否相等:",
      np.allclose(A.dot(eig_vex),sigma.dot(eig_vex)))

输出为:

A × eig_vex与eig_vex × sigma是否相等: True
A × eig_vex与sigma × eig_vex是否相等: False

三、特征值分解

  特征值分解是将矩阵 A {A} A 分解成 A = Q ∑ Q − 1 {A=Q\sum Q^{-1}} A=QQ1的形式,分解前提是 A {A} A 必须是 n {n} n 阶方阵且可以对角化。公式中, Q {Q} Q A {A} A 的特征向量组成的矩阵, ∑ {\sum} 是对角阵,其主对角线上的元素代表 A {A} A 的特征值,特征向量矩阵 Q {Q} Q 的第 i {i} i 个列向量与 ∑ {\sum} 的第 i {i} i 行对角线上的特征值对应, Q − 1 {Q^{-1}} Q1 Q {Q} Q 的逆矩阵。

import numpy as np
B = [[4,2], [1,5]]
A = np.array(B)
eig_val,eig_vex = np.linalg.eig(A)   # eig()函数求解特征值和特征向量
print("A的特征值为:\n",eig_val)
print("A的特征向量为:\n",eig_vex)
sigma = np.diag(eig_val)           # 特征值的对角化
print("特征值矩阵:\n",sigma)
C = eig_vex.dot(sigma.dot(np.linalg.inv(eig_vex)))
print("A与新构造出的矩阵C是否相同",np.allclose(A,C))

输出为:

A的特征值为:
 [3. 6.]
A的特征向量为:
 [[-0.89442719 -0.70710678]
 [ 0.4472136  -0.70710678]]
特征值矩阵:
 [[3. 0.]
 [0. 6.]]
A与新构造出的矩阵C是否相同 True

  利用eig()函数得到的 e i g _ v a l {eig\_val} eig_val 是特征值,利用diag()函数将特征值对角化得到的 s i g m a {sigma} sigma ∑ {\sum} e i g _ v e x {eig\_vex} eig_vex Q {Q} Q ,使用dot()函数将 Q {Q} Q ∑ {\sum} Q − 1 {Q^{-1}} Q1 相乘构出新矩阵,通过allclose()函数判断新矩阵是否与原矩阵相同, T r u e {True} True 说明 A = Q ∑ Q − 1 {A=Q\sum Q^{-1}} A=QQ1 成立。

参考资料
人工智能数学基础(北京大学出版社)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐