【AI数学】特征值与特征向量篇python(学习记录)
一、特征值与特征向量简介 特征值与特征向量是线性代数的核心内容,也是方阵的属性之一,在机器学习算法中应用十分广泛,可应用在降维、特征提取、图像压缩等领域。 矩阵与向量相乘是对向量进行线性变换,是对原始向量同时施加方向和长度的变化。通常情况下,绝大部分向量都会被这个矩阵变换的面目全非,但是存在一些特殊的向量,被矩阵变换之后,仅有长度上的变化,用数学公式表示为 Ax=λx{ Ax=\lambda}
一、特征值与特征向量简介
特征值与特征向量是线性代数的核心内容,也是方阵的属性之一,在机器学习算法中应用十分广泛,可应用在降维、特征提取、图像压缩等领域。
矩阵与向量相乘是对向量进行线性变换,是对原始向量同时施加方向和长度的变化。通常情况下,绝大部分向量都会被这个矩阵变换的面目全非,但是存在一些特殊的向量,被矩阵变换之后,仅有长度上的变化,用数学公式表示为
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=Q∑Q−1的形式,分解前提是 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}} Q−1 是 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}} Q−1 相乘构出新矩阵,通过allclose()函数判断新矩阵是否与原矩阵相同, T r u e {True} True 说明 A = Q ∑ Q − 1 {A=Q\sum Q^{-1}} A=Q∑Q−1 成立。
参考资料
人工智能数学基础(北京大学出版社)
更多推荐
所有评论(0)