一、特征值与特征向量简介
特征值与特征向量是线性代数的核心内容,也是方阵的属性之一,在机器学习算法中应用十分广泛,可应用在降维、特征提取、图像压缩等领域。
矩阵与向量相乘是对向量进行线性变换,是对原始向量同时施加方向和长度的变化。通常情况下,绝大部分向量都会被这个矩阵变换的面目全非,但是存在一些特殊的向量,被矩阵变换之后,仅有长度上的变化,用数学公式表示为 ,其中 为向量, 对应长度变化的比例,称 为特征值, 为 对应的特征向量。
矩阵特征值与特征向量的动态意义在于变化的速度与方向,特征向量对应变化方向,而特征值对应变化速度。
二、求解特征值与特征向量
,根据np.linalg.eig()函数的返回值,得到方阵 的特征值和特征向量。
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()函数求解出的特征向量已经标准化,即满足
根据特征值生成特征矩阵 ,验证:
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
三、特征值分解
分解成 的形式,分解前提是 必须是 阶方阵且可以对角化。公式中, 是 的特征向量组成的矩阵, 是对角阵,其主对角线上的元素代表 的特征值,特征向量矩阵 的第 个列向量与 的第 行对角线上的特征值对应, 是
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
是特征值,利用diag()函数将特征值对角化得到的 是 , 是 ,使用dot()函数将 、 和 相乘构出新矩阵,通过allclose()函数判断新矩阵是否与原矩阵相同, 说明
参考资料
人工智能数学基础(北京大学出版社)