★本文是《机器学习数学基础》的节选。本书目前正在编审中,即将由电子工业出版社出版。关于本书的更多信息,可以访问下述地址:https://qiwsir.gitee.io/mathmetics/。这里提供了与本书相关的补充资料以及本书的目录。
”
3.1 基本概念
在第2章中,我们已经反复强化了一个观念——矩阵就是映射,如果用矩阵乘以一个向量,比如:
如图3-1-1所示,矩阵
对向量
实施了线性变换后,从
变换为
,在这个变换过程,向量
相对
发生了旋转和长度伸长。这是一种比较一般的变换,本节要研究的不是这种,而是一类特殊的变换,但仍然是线性变换。
3.1.1 定义
有这样一些向量,如果通过某线性变换之后,它只在大小上发生了变换——显然这些向量是众向量中比较特立独行的。
以图3-1-1中的向量
为例,用列向量表示为
,矩阵
乘以这个向量,即对其进行线性变换:
经过线性变换之后,所得矩阵如图3-1-1中的
所示。从图中可以清晰看出,对于向量
而言,经矩阵
线性变换之后,所得到的向量相对于原向量只是长度变化了,方向没变。换言之,就是变换后的向量(矩阵)方向与原向量(矩阵)方向一致。
那么,这个向量
就是一个比较特殊的向量。注意,不是所有向量都如此,而且在此向量空间中对于线性变换
而言,也不只有一个这样的向量,如图3-1-1中标识的另外一个向量
,也具有同样的性质。
请注意,表示线性变换的矩阵
必须是方阵,否则就成为不同子空间的线性映射了,在不同子空间中的向量,不具有上面所讨论的可比性。
如果再考察线性变换之后的向量与原向量的大小关系,会发现如下关系:
线性变换之后的向量与原向量之间是倍数关系(在实数域,倍数就是一个实数)。
至此我们探讨了这样一种特殊的向量,它的特点可以严格表述为:
★设
是
的矩阵,如果存在非零向量
,使下式成立:
则标量
是矩阵
的特征值(eigenvalue),向量
是特征值对应的特征向量(eigenvector)。
”
对于示例
,
是矩阵
的特征值,
是相应的特征向量。
注意,特征值
可以是正数,也可以是负数。如果
,则意味着
和
的方向相反。另外,通过前面关于矩阵
计算可知,它的特征值和特征向量都不只有一个,这是比较一般的现象。
如果以
表示矩阵
的特征向量,
为相应的特征值,并且不重复(这很重要),则特征向量组
线性无关(对这个结论可以用反证法进行证明,在本书在线资料中有详细证明,请参阅),那么它们就生成了一个子空间,称为特征空间。
如何计算一个方阵的特征值和特征向量呢?比如前面示例中使用的矩阵
的特征值和特征向量都有哪些?
根据定义中的
,可得:
(3.1.1)
我们不将零向量作为特征向量,即特征向量
,只讨论(3.1.1)式有非零解的情况,即
不可逆,由第2章2.4.2节可知(或参考本节最后的总结):
这个方程称为矩阵
的特征方程,通过特征方程,可以求解特征值
。其中
是特征多项式(characteristic polynomial)。
例如矩阵
,先写出矩阵
的特征多项式:
最终得到了一个多项式,令此多项式等于
,即:
,
则:
解得:
或
故矩阵
的特征是是
和
。
对于特征值而言,所对应的特征向量可能会有多个。例如,当
时,可以通过求解
得到向量
:
利用求解线性方程组的方法,可得:
,其中
为实数。因此,矩阵
的特征值
对应的非零特征向量,可以写成:
同样方法,可以求得
的特征向量为:
,其中
为实数。
由上面示例可知,计算矩阵的特征值,重要步骤是写出它的特征多项式。
如果遇到了某种特殊形态的矩阵,计算
会比较简单。例如:
矩阵
称为上三角矩阵,矩阵
称为下三角矩阵。三角矩阵的行列式等于主对角线上元素的乘积,
。那么,三角矩阵的特征多项式即为:
由此可知,三角矩阵的特征值就是主对角线的元素。
除了特殊矩阵,就一般矩阵而言,特别是“大矩阵”,如果用手工计算方法求特征值和特征向量,感受一定不太舒服,例如谷歌搜索的核心PageRank算法,它就用到矩阵的特征向量,2002年时,这个矩阵是
。对于如此巨大的矩阵,当然不能用手工计算了,必须要教给机器。不过,谷歌所用的方法,也不是下面程序中介绍的。至今,谷歌尚未完全公开它的计算方法。
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
是特征向量,并且此特征向量是经过标准化之后的特征向量,即特征向量的欧几里得长度(
范数)为
。注意,返回的特征向量是一个二维数组(矩阵),每一列是矩阵A
的一个特征向量。例如第一个特征向量vectors[:, 0]
,其所对应的特征值是values[0]
。
A.dot(vectors[:,0])
# 输出
array([ -3.73863537, -8.46653421, -13.19443305])
这里计算的是
,得到了一个向量。下面用相应的特征值计算
,检验输出结果是否与上述结果一致。
values[0] * vectors[:,0]
# 输出
array([ -3.73863537, -8.46653421, -13.19443305])
对比两个输出结果,用特征向量vectors[:,0]
和特征值values[0]
验证了
。
此处先对特征值和特征向量的基本概念有初步了解,在后续章节中,将不断使用它们帮助我们解决一些问题,并且还会将有关探讨深化。
★推荐阅读:https://qiwsir.gitee.io/mathmetics/,有更多与机器学习有关的内容。
”