★本文是《机器学习数学基础》的节选。本书目前正在编审中,即将由电子工业出版社出版。关于本书的更多信息,可以访问下述地址:https://qiwsir.gitee.io/mathmetics/。这里提供了与本书相关的补充资料以及本书的目录。
”
3.1 基本概念
在第2章中,我们已经反复强化了一个观念——矩阵就是映射,如果用矩阵乘以一个向量,比如:
\begin{split}&\pmb{A}=\begin{bmatrix}2&-1\\0&3\end{bmatrix}, \pmb{v}_{A} = \begin{bmatrix}2\\1\end{bmatrix} \\ &\pmb{A} \pmb{v}_{A} = \begin{bmatrix}2&-1\\0&3\end{bmatrix} \begin{bmatrix}2\\1\end{bmatrix} = \begin{bmatrix}3\\3\end{bmatrix}\end{split}
如图3-1-1所示,矩阵
\pmb A 对向量
\pmb v_{A} 实施了线性变换后,从
\overrightarrow{OA} 变换为
\overrightarrow{OB},在这个变换过程,向量
\pmb v_{B} 相对
\pmb v_{A} 发生了旋转和长度伸长。这是一种比较一般的变换,本节要研究的不是这种,而是一类特殊的变换,但仍然是线性变换。
3.1.1 定义
有这样一些向量,如果通过某线性变换之后,它只在大小上发生了变换——显然这些向量是众向量中比较特立独行的。
以图3-1-1中的向量
\overrightarrow{OC} 为例,用列向量表示为
\pmb{v}_C=\begin{bmatrix}-2\\0\end{bmatrix} ,矩阵
\mathbf{A} 乘以这个向量,即对其进行线性变换:
\pmb{A} \pmb{v}_C = \begin{bmatrix}2&-1\\0&3\end{bmatrix} \begin{bmatrix}-2\\0\end{bmatrix} = \begin{bmatrix}-4\\0\end{bmatrix}
经过线性变换之后,所得矩阵如图3-1-1中的
\overrightarrow{OD} 所示。从图中可以清晰看出,对于向量
\pmb{v}_C 而言,经矩阵
\pmb{A} 线性变换之后,所得到的向量相对于原向量只是长度变化了,方向没变。换言之,就是变换后的向量(矩阵)方向与原向量(矩阵)方向一致。
那么,这个向量
\pmb{v}_C 就是一个比较特殊的向量。注意,不是所有向量都如此,而且在此向量空间中对于线性变换
\mathbf{A} 而言,也不只有一个这样的向量,如图3-1-1中标识的另外一个向量
\overrightarrow{OE} ,也具有同样的性质。
\begin{split} &\pmb{v}_E=\begin{bmatrix}1\\-1\end{bmatrix}\\ &\pmb{A} \pmb{v}_E = \begin{bmatrix}2&-1\\0&3\end{bmatrix} \begin{bmatrix}1\\-1\end{bmatrix} = \begin{bmatrix}3\\-3\end{bmatrix}\end{split}
请注意,表示线性变换的矩阵
\pmb{A} 必须是方阵,否则就成为不同子空间的线性映射了,在不同子空间中的向量,不具有上面所讨论的可比性。
如果再考察线性变换之后的向量与原向量的大小关系,会发现如下关系:
\begin{split}&\pmb{A} \pmb{v}_C = \begin{bmatrix}2&-1\\0&3\end{bmatrix} \begin{bmatrix}-2\\0\end{bmatrix} = \begin{bmatrix}-4\\0\end{bmatrix}=2\begin{bmatrix}-2\\0\end{bmatrix}=2\pmb{v}_C\\&\pmb{A} \pmb{v}_E = \begin{bmatrix}2&-1\\0&3\end{bmatrix} \begin{bmatrix}1\\-1\end{bmatrix} = \begin{bmatrix}3\\-3\end{bmatrix}=3\begin{bmatrix}1\\-1\end{bmatrix}=3\pmb{v}_E\end{split}
线性变换之后的向量与原向量之间是倍数关系(在实数域,倍数就是一个实数)。
至此我们探讨了这样一种特殊的向量,它的特点可以严格表述为:
★设
\pmb{A} 是
n×n 的矩阵,如果存在非零向量
\pmb v,使下式成立:
\pmb{Av} = \lambda \pmb{v}
则标量
\lambda 是矩阵
\mathbf{A} 的特征值(eigenvalue),向量
\pmb v 是特征值对应的特征向量(eigenvector)。
”
对于示例
\pmb{Av}_C=2\pmb{v}_C ,
2 是矩阵
\pmb{A} 的特征值,
\pmb{v}_C=\begin{bmatrix}-2\\0\end{bmatrix} 是相应的特征向量。
注意,特征值
\lambda 可以是正数,也可以是负数。如果
\lambda \lt 0,则意味着
\pmb{v} 和
\pmb{Av} 的方向相反。另外,通过前面关于矩阵
\pmb{A} = \begin{bmatrix}2&-1\\0&3\end{bmatrix} 计算可知,它的特征值和特征向量都不只有一个,这是比较一般的现象。
如果以
\pmb{v}_1, \pmb{v}_2, \cdots, \pmb{v}_k 表示矩阵
\pmb{A} 的特征向量,
\lambda_1, \lambda_2, \cdots, \lambda_k 为相应的特征值,并且不重复(这很重要),则特征向量组
\{\pmb{v}_1, \pmb{v}_2, \cdots, \pmb{v}_k\} 线性无关(对这个结论可以用反证法进行证明,在本书在线资料中有详细证明,请参阅),那么它们就生成了一个子空间,称为特征空间。
如何计算一个方阵的特征值和特征向量呢?比如前面示例中使用的矩阵
\pmb{A} = \begin{bmatrix}2&-1\\0&3\end{bmatrix} 的特征值和特征向量都有哪些?
根据定义中的
\pmb{Av} = \lambda \pmb{v},可得:
\pmb{Av} - \lambda \pmb{v} = 0
(\pmb{A} - \lambda \pmb{I}_n)\pmb{v} = 0 (3.1.1)
我们不将零向量作为特征向量,即特征向量
\pmb v \ne \mathbf 0,只讨论(3.1.1)式有非零解的情况,即
\pmb{A} - \lambda\pmb{I}_n 不可逆,由第2章2.4.2节可知(或参考本节最后的总结):
|\pmb{A}-\lambda \pmb{I}_n| = 0
这个方程称为矩阵
\pmb{A} 的特征方程,通过特征方程,可以求解特征值
\lambda。其中
|\pmb{A}-\lambda \pmb{I}_n| 是特征多项式(characteristic polynomial)。
例如矩阵
\pmb{A} = \begin{bmatrix}-4&-6\\3&5\end{bmatrix},先写出矩阵
\pmb{A} 的特征多项式:
\pmb{A}-\lambda \pmb{I}_n = \begin{bmatrix}-4&-6\\3&5\end{bmatrix}-\lambda \begin{bmatrix}1&0\\0&1\end{bmatrix}=\begin{bmatrix}-4-\lambda &-6\\3&5-\lambda\end{bmatrix}
\begin{vmatrix}\pmb{A}-\lambda \pmb{I}_n \end{vmatrix}= \begin{vmatrix}-4-\lambda&-6\\3&5-\lambda\end{vmatrix}=(-4-\lambda)(5-\lambda)+1
最终得到了一个多项式,令此多项式等于
0,即:
(-4-\lambda)(5-\lambda)+1=0,
则:
\lambda^2-\lambda-2=0解得:
\lambda=2 或
\lambda=-1故矩阵
\pmb{A} 的特征是是
2 和
-1。
对于特征值而言,所对应的特征向量可能会有多个。例如,当
\lambda=2 时,可以通过求解
(\pmb{A}-2\pmb{I}_2)\pmb{v} = \pmb{0} 得到向量
\mathbf v:
\begin{bmatrix}-6&-6\\3&3\end{bmatrix}\begin{bmatrix}v_1\\v_2\end{bmatrix}=0
利用求解线性方程组的方法,可得:
\begin{cases}v_1=-r\\v_2=r\end{cases},其中
r 为实数。因此,矩阵
\mathbf{A} 的特征值
2 对应的非零特征向量,可以写成:
r\begin{bmatrix}-1\\1\end{bmatrix}
同样方法,可以求得
\lambda=-1 的特征向量为:
s\begin{bmatrix}-2\\1\end{bmatrix},其中
s 为实数。
由上面示例可知,计算矩阵的特征值,重要步骤是写出它的特征多项式。
如果遇到了某种特殊形态的矩阵,计算
|\pmb{A}-\lambda\pmb{I}_n| 会比较简单。例如:
\pmb{A} = \begin{bmatrix}a_{11}&a_{12}&a_{13}\\0&a_{22}&a_{23}\\0&0&a_{33}\end{bmatrix},\pmb{B}= \begin{bmatrix}a_{11}&0&0\\a_{21}&a_{22}&0\\a_{31}&a_{32}&a_{33}\end{bmatrix}
矩阵
\pmb{A} 称为上三角矩阵,矩阵
\pmb{B} 称为下三角矩阵。三角矩阵的行列式等于主对角线上元素的乘积,
|\pmb{A}|= a_{11}a_{22}a_{33} 。那么,三角矩阵的特征多项式即为:
f(\lambda) = |\pmb{A}-\lambda \pmb{I}_n| = \begin{vmatrix}a_{11}-\lambda&a_{12}&a_{13}\\0&a_{22}-\lambda&a_{23}\\0&0&a_{33}-\lambda\end{vmatrix}=(a_{11}-\lambda)(a_{22}-\lambda)(a_{33}-\lambda)
由此可知,三角矩阵的特征值就是主对角线的元素。
除了特殊矩阵,就一般矩阵而言,特别是“大矩阵”,如果用手工计算方法求特征值和特征向量,感受一定不太舒服,例如谷歌搜索的核心PageRank算法,它就用到矩阵的特征向量,2002年时,这个矩阵是
27亿×27亿。对于如此巨大的矩阵,当然不能用手工计算了,必须要教给机器。不过,谷歌所用的方法,也不是下面程序中介绍的。至今,谷歌尚未完全公开它的计算方法。
import numpy as np
from numpy.linalg import eig
A = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 用二维数组表示矩阵
values, vectors = eig(A) # 计算矩阵的特征值和特征向量
values # 输出特征值
# 输出
array([ 1.61168440e+01, -1.11684397e+00, -1.30367773e-15])
vectors # 输出特征向量
# 输出
array([[-0.23197069, -0.78583024, 0.40824829],
[-0.52532209, -0.08675134, -0.81649658],
[-0.8186735 , 0.61232756, 0.40824829]])
函数eig()
的返回值有两个,values
是矩阵 A
的特征值,vectors
是特征向量,并且此特征向量是经过标准化之后的特征向量,即特征向量的欧几里得长度(
l_2 范数)为
1 。注意,返回的特征向量是一个二维数组(矩阵),每一列是矩阵A
的一个特征向量。例如第一个特征向量vectors[:, 0]
,其所对应的特征值是values[0]
。
A.dot(vectors[:,0])
# 输出
array([ -3.73863537, -8.46653421, -13.19443305])
这里计算的是
\pmb{Av} ,得到了一个向量。下面用相应的特征值计算
\lambda\pmb{v} ,检验输出结果是否与上述结果一致。
values[0] * vectors[:,0]
# 输出
array([ -3.73863537, -8.46653421, -13.19443305])
对比两个输出结果,用特征向量vectors[:,0]
和特征值values[0]
验证了
\pmb{Av} = \lambda \pmb{v} 。
此处先对特征值和特征向量的基本概念有初步了解,在后续章节中,将不断使用它们帮助我们解决一些问题,并且还会将有关探讨深化。
★推荐阅读:https://qiwsir.gitee.io/mathmetics/,有更多与机器学习有关的内容。
”