深度学习基础:线性代数(1)_特征分解及numpy、scipy实现
特征分解的意义
有时,我们会将现实中的某些事物抽象成矩阵的形式,例如可以将一张图片抽象成一个像素值组成的矩阵。此时,我们也许希望中将矩阵分解成多个组成部分,这些组成部分代表了这个矩阵的特征,这就是特征分解的意义。
特征值与特征向量
给定方阵$A$,如果存在向量$v$和标量$\lambda$,使得
$$Av=λv$$
那么$v$称为矩阵A的特征向量,$\lambda$称为特征向量$v$对应的特征值。
注意:如果$v$是矩阵$A$的特征向量,那么对v缩放任意倍,即$sv(S \in {\Bbb {R}}, S \neq 0)$均是矩阵$A$的特征向量,因此通常只考虑单位特征向量。
特征分解
假设矩阵$A$有n个特征无关的特征向量${v_1, v_2, ..., v_n}$,对应的特征值为${\lambda_1, \lambda_2, ..., \lambda_n}$。
我们将特征向量连接成一个矩阵,使得每一列是一个特征向量:$V = [v_1, v_2, ..., v_n]$。同样的,我们将特征值连接成一个向量$\lambda = [\lambda_1, \lambda_2, ..., \lambda_n]$。可以得到下式:
$$AV = Vdiag(\lambda)$$
其中$diag(\lambda)$是向量$\lambda$对应的对角矩阵。令
$$AVV^{-1} = Vdiag(\lambda)V^{-1}$$
即
$$A = Vdiag(\lambda)V^{-1}$$
此时,矩阵$A$便可以分解为特征值和特征向量的乘积,称为特征分解。
正交矩阵
如果$AA^T = E$($E$为单位矩阵,$A^T$表示矩阵$A$的转置矩阵)或$A^TA=E$,则$n$阶实矩阵$A$称为正交矩阵。
实对称矩阵的特征分解
不是每个矩阵都可以分解成特征值和特征向量。即使特征分解存在,也有可能涉及到复数。但对于实对称矩阵来说,其必可以分解成实特征值和实特征向量。
令
$$A = Q \Lambda Q^T$$
其中$Q$是矩阵$A$的特征向量组成的正交矩阵,$\Lambda$是对角矩阵。特征值$\Lambda{i,i}$对应的特征向量是矩阵$Q$的第$i$列,记作$Q{:,i}$。因为$Q$是正交矩阵,我们可以将$A$看作是沿方向$v_i$延伸$\lambda_i$倍的空间。
实对称矩阵在二次方程中的应用
对于二次方程
$$ f(x) = x^TAx, ||x||_2 = 1$$
当$x$是特征向量时,$f(x)$就是$x$对应的特征值。因此在$x$是单位向量的限制下,函数$f(x)$的最大值就是最大特征值,最小值就是最小特征值。
正定、半正定、负定、半负定
- 正定:所有特征值都是正数,即$x^TAx > 0$。
- 半正定:所有特征值都是非负数,即$x^TAx \geq 0$。
- 负定:所有特征值都是负数,即$x^TAx < 0$。
- 半负定:所有特征值都是非负数,即$x^TAx \leq 0$。
Python实现
Numpy
import numpy as np
A = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
# 计算特征值
print(np.linalg.eigvals(A))
# 同时计算特征值和特征向量
eigvals, eigvectors = np.linalg.eig(A)
print(eigvals)
print(eigvectors)
Scipy
import numpy as np
import scipy as sp
from scipy import linalg
A = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
# 计算特征值
print(sp.linalg.eigvals(A))
# 同时计算特征值和特征向量
eigvals, eigvectors = sp.linalg.eig(A)
print(eigvals)
print(eigvectors)
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/fundamentals-of-deep-learning-linear-algebra-feature-decomposition-and-implementation-of-numpy-and-scipy/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论