目录 ????
1️⃣ 简单说一下特征值、特征向量与特征分解
I. 特征值、特征向量与特征分解
II. 几何意义
III. 如何实现通过Matlab、Python实现
2️⃣详细解说SVD
I. 几何意义
I. 奇异值分解的推导过程
I. SVD算例
I. 如何通过Matlab和Python
3️⃣应用举例
I. 特征值、特征向量与特征分解
4️⃣特征分解、奇异值分解的区别
I. 特征分解、奇异值分解的区别
简单说一下特征值、特征向量与特征分解
特征值、特征向量与特征分解
Theory:
对于一个正阵M,满足如下:
Mx=λx
其中λ被成为特征值,满足∣∣M−λE∣∣=0再有(M−λE)x=0,可计算其特征向量。
如果有了特征值和特征向量后呢,则可以将矩阵M用特征分解:
M=W∑W−1
W=w1,w2,...,wn分别是特征值λ1,λ2,...,λn对应的特征向量构成的方阵
几何意义
对应矩阵M,其对应的线性变化
Mx=x′
上面这个式子,Mx,x′是一个向量,x,x′可能是不共线的(如图(b)),如果向量Mx,x′满足Mx=x′=λx,则如图(b),这说明了这个变换就是对向量x做一个拉伸或者压缩。

如何实现通过Matlab、Python实现
数学推导:
Mx=λx
Mx−λx=(M−λE)x=0
齐次线性方程组有非零解,则∣∣M−λE∣∣=0可求得特征向量
再带回,可得特征向量。
Matlab:
d = eig(M) % 求取矩阵M的特征值,向量形式存储
[V,D] = eig(M) % 计算M的特征值对角阵D和特征向量V,使得MV = VD成立
[V,D] = eig(M,'nobalance') %当矩阵M中有与截断误差数量级相差不远的值时,该指令可能更精确。'nobalance'起误差调节作用
Python
numpy科学计算库提供相应的方法
import numpy as np
x = np.diag((1,2,3)) # 这是你想要求取特征值的数组
a,b = numpy.linalg.elg(x) # 特征值赋值给a,对应的特征向量赋值给b
详细解说SVD
SVD的英文全称: Singular Value Decomposition,中文名字:奇异值分解
几何意义
图来源
以二维空间为例


几何意义就是把一个单位正交的网格,转换为另外一个单位正交的网格
假如选取了一组单位正交基{v1,v2},刚好矩阵M的线性变化(Mv1,Mv2)也正交,用u1,u2分别表示Mv1,Mv2的单位向量,用λ1,λ2表示Mv1,Mv2的长度,描述网格在这些特定方向上的拉伸量,也被称作矩阵M的奇异值。
Mv1=λ1u1
Mv2=λ2u2
对任意给定的向量x,则有
x=(v1⋅x)v1+(v2⋅x)v2
再将M的线性变换
MxMx=(v1⋅x)MN1+(v2⋅x)Mv2=(v1⋅x)σ1u1+(v2⋅x)σ2u2
Mx=u1σ1v1⊤x+u2σ2v2⊤xM=u1σ1v1⊤+u2σ2v2⊤
so
M=UΣVT
奇异值分解的推导过程
u=(u1,u2,...,um)
v=(v1,v2,...,vn)
u,v都是空间的基,是正交矩阵 uTu=E,vTv=E

任何一个矩阵Mm∗n,rank(M)=k,一定存在SVD,换句话说,M可以将一组单位正交基映射到另一组单位正交基。答案是肯定的
证明如下:
在n为空间中,有一组单位正交基{v1,v2,...,vn},线性变化作用以后
Mv1,Mv2,...,Mvn
也是正交的,则有
(Mvi,Mvj)=(Mxi)TMvj=viTMTMvj=0
注意喔,MTM是矩阵喔,则会有MTMvj=λvj
接下去,
viTMTMvj=viTλjvj=λjviTvj=λjviv˙j=0
上述就证明了是有的:任何一个矩阵,都可以将一组单位正交基转换成另外一组正交基。
当i=j,<Mvi,Mvi>=λivivi=λi
进行一些单位化,记ui=∣Mvi∣Avi=λi1Mvi
则
Avi=σiui,σi(奇异值)=λi,0≤i≤k,k=Rank(A)
当k<i<=m时,对u1,u2,...,uk进行扩展u(k+1),...,um,使得u1,u2,...,um为m维空间中的一组正交基.也可对v1,v2,...,vk进行扩展,扩展的vk+1,...,vn存在零子空间里面。
M[v1⋯vk∣∣vk+1⋯vm]=⎣⎢⎢⎢⎢⎢⎢⎢⎡u1T⋮uk+1ukT⋮unT⎦⎥⎥⎥⎥⎥⎥⎥⎤⎣⎡σ10⋱0σk0000⎦⎤
M=[u1⋯uk]⎣⎡σ1⋱σk⎦⎤⎣⎢⎡v1T⋮vkT⎦⎥⎤+[uk+1⋯um][0]⎣⎢⎡vk+1T⋮vnT⎦⎥⎤
SVD算例
U:AAT的特征值和特征向量,用单位化的特征向量构成 U
V: ATA 的特征值和特征向量,用单位化的特征向量构成 V
$\sum_{mn} $ :将$ AA^{T} 或者ATA的特征值求平方根,然后构成Σ以矩阵A = \left[\begin{matrix} 1 & 1\1 &1\ 0 &0\\end{matrix} \right]$
第一步 U ,下面是一种计算方法
对矩阵AAT=⎣⎡220220000⎦⎤特征分解,
特征是4,0,0
特征向量是$
\left[\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}, 0\right]^{T},\left[-\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}, 0\right]{T},[0,0,1]{T}$,可得到
U=⎣⎡21210−21210001⎦⎤
第二步
计算矩阵ATA的特征分解,可得
特征值4,0,
V=[2121−2121]
第三步
计算∑mn
Σ=⎣⎡200000⎦⎤
最后,
A=UΣVT=⎣⎡21210−21210001⎦⎤⎣⎡200000⎦⎤[2121−2121]T=⎣⎡110110⎦⎤
如何通过Matlab和Python
Matlab:
s = svd(A)
[U,S,V] = svd(A)
[U,S,V] = svd(A,'econ')
[U,S,V] = svd(A,0)
input: A 矩阵
output:
s:奇异值,以列向量形式返回。奇异值是以降序顺序列出的非负实数
S:
U:左奇异向量,以矩阵的列形式返回。
V:奇异值,以对角矩阵形式返回。S 的对角元素是以降序排列的非负奇异值。
右奇异向量,以矩阵的列形式返回。
Python
import numpy as np
M = np.array([ [1,1,2],[0,0,1]])
U,S,V = np.linalg.svd(M)
应用举例
应用
2.1 信息检索
2.2 推荐系统
2.3 基于协同过滤的推荐系统
2.4 图像压缩
特征值分解和奇异值分解的区别
- 特征值分解只能是方阵,而奇异值分解是矩阵就可以
- 特征值分解只考虑了对矩阵缩放效果,奇异值分解对矩阵有选择、收缩、投影的效果

