目录 ?
1️⃣ 简单说一下特征值、特征向量与特征分解
I. 特征值、特征向量与特征分解
II. 几何意义
III. 如何实现通过Matlab、Python实现
2️⃣详细解说SVD
I. 几何意义
I. 奇异值分解的推导过程
I. SVD算例
I. 如何通过Matlab和Python
3️⃣应用举例
I. 特征值、特征向量与特征分解
4️⃣特征分解、奇异值分解的区别
I. 特征分解、奇异值分解的区别
简单说一下特征值、特征向量与特征分解
特征值、特征向量与特征分解
Theory:
对于一个正阵
M
M
M,满足如下:
M
x
=
λ
x
Mx=\lambda x
Mx=λx
其中
λ
\lambda
λ被成为特征值,满足
∣
∣
M
−
λ
E
∣
∣
=
0
||M-\lambda E||=0
∣∣M−λE∣∣=0再有
(
M
−
λ
E
)
x
=
0
(M-\lambda E)x=0
(M−λE)x=0,可计算其特征向量。
如果有了特征值和特征向量后呢,则可以将矩阵
M
M
M用特征分解:
M
=
W
∑
W
−
1
M=W\sum W^{-1}
M=W∑W−1
W
=
w
1
,
w
2
,
.
.
.
,
w
n
W={w_1,w_2,...,w_n}
W=w1,w2,...,wn分别是特征值
λ
1
,
λ
2
,
.
.
.
,
λ
n
\lambda_1,\lambda_2,...,\lambda_n
λ1,λ2,...,λn对应的特征向量构成的方阵
几何意义
对应矩阵M,其对应的线性变化
M
x
=
x
′
Mx = x'
Mx=x′
上面这个式子,
M
x
,
x
′
Mx,x'
Mx,x′是一个向量,
x
,
x
′
x,x'
x,x′可能是不共线的(如图(b)),如果向量
M
x
,
x
′
Mx,x'
Mx,x′满足
M
x
=
x
′
=
λ
x
Mx=x'=\lambda x
Mx=x′=λx,则如图(b),这说明了这个变换就是对向量x做一个拉伸或者压缩。
如何实现通过Matlab、Python实现
数学推导:
M
x
=
λ
x
Mx = \lambda x
Mx=λx
M
x
−
λ
x
=
(
M
−
λ
E
)
x
=
0
Mx-\lambda x=(M-\lambda E)x=0
Mx−λx=(M−λE)x=0
齐次线性方程组有非零解,则
∣
∣
M
−
λ
E
∣
∣
=
0
||M-\lambda E||=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,中文名字:奇异值分解
几何意义
图来源
以二维空间为例
几何意义就是把一个单位正交的网格,转换为另外一个单位正交的网格
假如选取了一组单位正交基{
v
⃗
1
,
v
⃗
2
\vec{v}_1,\vec{v}_2
v1,v2},刚好矩阵M的线性变化(
M
v
⃗
1
M\vec{v}_1
Mv1,
M
v
⃗
2
M\vec{v}_2
Mv2)也正交,用
u
⃗
1
,
u
⃗
2
\vec{u}_1,\vec{u}_2
u1,u2分别表示
M
v
⃗
1
M\vec{v}_1
Mv1,
M
v
⃗
2
M\vec{v}_2
Mv2的单位向量,用
λ
1
,
λ
2
\lambda_1,\lambda_2
λ1,λ2表示
M
v
⃗
1
M\vec{v}_1
Mv1,
M
v
⃗
2
M\vec{v}_2
Mv2的长度,描述网格在这些特定方向上的拉伸量,也被称作矩阵M的奇异值。
M
v
⃗
1
=
λ
1
u
⃗
1
M\vec{v}_1 =\lambda_1\vec{u}_1
Mv1=λ1u1
M
v
⃗
2
=
λ
2
u
⃗
2
M\vec{v}_2 =\lambda_2\vec{u}_2
Mv2=λ2u2
对任意给定的向量
x
⃗
\vec{x}
x,则有
x
=
(
v
1
⋅
x
)
v
1
+
(
v
2
⋅
x
)
v
2
\mathbf{x}=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) \mathbf{v}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) \mathbf{v}_{2}
x=(v1⋅x)v1+(v2⋅x)v2
再将M的线性变换
M
x
=
(
v
1
⋅
x
)
M
N
1
+
(
v
2
⋅
x
)
M
v
2
M
x
=
(
v
1
⋅
x
)
σ
1
u
1
+
(
v
2
⋅
x
)
σ
2
u
2
\begin{aligned} M \mathbf{x} &=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) M \mathbf{N}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) M \mathbf{v}_{2} \\ M \mathbf{x} &=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) \sigma_{1} \mathbf{u}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) \sigma_{2} \mathbf{u}_{2} \end{aligned}
MxMx=(v1⋅x)MN1+(v2⋅x)Mv2=(v1⋅x)σ1u1+(v2⋅x)σ2u2
M
x
=
u
1
σ
1
v
1
⊤
x
+
u
2
σ
2
v
2
⊤
x
M
=
u
1
σ
1
v
1
⊤
+
u
2
σ
2
v
2
⊤
\begin{array}{c}{M \mathbf{x}=\mathbf{u}_{1} \sigma_{1} \mathbf{v}_{1}^{\top} \mathbf{x}+\mathbf{u}_{2} \sigma_{2} \mathbf{v}_{2}^{\top} \mathbf{x}} \\ {M=\mathbf{u}_{1} \sigma_{1} \mathbf{v}_{1}^{\top}+\mathbf{u}_{2} \sigma_{2} \mathbf{v}_{2}^{\top}}\end{array}
Mx=u1σ1v1⊤x+u2σ2v2⊤xM=u1σ1v1⊤+u2σ2v2⊤
so
M
=
U
Σ
V
T
M=U \Sigma V^{T}
M=UΣVT
奇异值分解的推导过程
u
=
(
u
1
,
u
2
,
.
.
.
,
u
m
)
u=(u_1,u_2,...,u_m)
u=(u1,u2,...,um)
v
=
(
v
1
,
v
2
,
.
.
.
,
v
n
)
v=(v_1,v_2,...,v_n)
v=(v1,v2,...,vn)
u
,
v
u,v
u,v都是空间的基,是正交矩阵
u
T
u
=
E
,
v
T
v
=
E
u^Tu=E,v^Tv = E
uTu=E,vTv=E
任何一个矩阵
M
m
∗
n
M_{m*n}
Mm∗n,
r
a
n
k
(
M
)
=
k
rank(M)=k
rank(M)=k,一定存在SVD,换句话说,M可以将一组单位正交基映射到另一组单位正交基。答案是肯定的
证明如下:
在n为空间中,有一组单位正交基{
v
⃗
1
,
v
⃗
2
,
.
.
.
,
v
⃗
n
\vec{v}_1,\vec{v}_2,...,\vec{v}_n
v1,v2,...,vn},线性变化作用以后
M
v
⃗
1
,
M
v
⃗
2
,
.
.
.
,
M
v
⃗
n
{M\vec{v}_1,M\vec{v}_2,...,M\vec{v}_n}
Mv1,Mv2,...,Mvn
也是正交的,则有
(
M
v
⃗
i
,
M
v
⃗
j
)
=
(
M
x
⃗
i
)
T
M
v
⃗
j
=
v
⃗
i
T
M
T
M
v
⃗
j
=
0
(M\vec{v}_i,M\vec{v}_j) = (M\vec{x}_i)^TM\vec{v}_j=\vec{v}_i^TM^TM\vec{v}_j=0
(Mvi,Mvj)=(Mxi)TMvj=viTMTMvj=0
注意喔,
M
T
M
M^TM
MTM是矩阵喔,则会有
M
T
M
v
⃗
j
=
λ
v
⃗
j
M^TM\vec{v}_j=\lambda \vec{v}_j
MTMvj=λvj
接下去,
v
i
T
M
T
M
v
j
=
v
i
T
λ
j
v
j
=
λ
j
v
i
T
v
j
=
λ
j
v
i
v
˙
j
=
0
\begin{aligned} v_{i}^{T} M^{T} \mathrm{M} v_{j}=& v_{i}^{T} \lambda_{j} v_{j} \\ &=\lambda_{j} v_{i}^{T} v_{j} \\ &=\lambda_{j} v_{i}\dot v_{j}=0 \end{aligned}
viTMTMvj=viTλjvj=λjviTvj=λjviv˙j=0
上述就证明了是有的:任何一个矩阵,都可以将一组单位正交基转换成另外一组正交基。
当
i
=
j
i=j
i=j,
<
M
v
⃗
i
,
M
v
⃗
i
>
=
λ
i
v
⃗
i
v
⃗
i
=
λ
i
<M\vec{v}_i,M \vec{v}_i>=\lambda_i \vec{v}_i \vec{v}_i =\lambda_i
<Mvi,Mvi>=λivivi=λi
进行一些单位化,记
u
i
=
A
v
⃗
i
∣
M
v
⃗
i
∣
=
1
λ
i
M
v
⃗
i
u_i=\frac{A\vec{v}_i}{|M\vec{v}_i|}=\frac{1}{\sqrt{\lambda_i}}M\vec{v}_i
ui=∣Mvi∣Avi=λi1Mvi
则
A
v
i
=
σ
i
u
i
,
σ
i
(
奇异值
)
=
λ
i
,
0
≤
i
≤
k
,
k
=
Rank
(
A
)
A v_{i}=\sigma_{i} u_{i}, \sigma_{i}(\operatorname{奇异值})=\sqrt{\lambda_{i}}, 0 \leq i \leq \mathrm{k}, \mathrm{k}=\operatorname{Rank}(\mathrm{A})
Avi=σiui,σi(奇异值)=λi,0≤i≤k,k=Rank(A)
当
k
<
i
<
=
m
k < i <= m
k<i<=m时,对
u
1
,
u
2
,
.
.
.
,
u
k
u1,u2,...,uk
u1,u2,...,uk进行扩展
u
(
k
+
1
)
,
.
.
.
,
u
m
u(k+1),...,um
u(k+1),...,um,使得
u
1
,
u
2
,
.
.
.
,
u
m
u1,u2,...,um
u1,u2,...,um为
m
m
m维空间中的一组正交基.也可对
v
⃗
1
,
v
⃗
2
,
.
.
.
,
v
⃗
k
\vec{v}_1,\vec{v}_2,...,\vec{v}_k
v1,v2,...,vk进行扩展,扩展的
v
⃗
k
+
1
,
.
.
.
,
v
⃗
n
\vec{v}_{k+1},...,\vec{v}_{n}
vk+1,...,vn存在零子空间里面。
M
[
v
⃗
1
⋯
v
⃗
k
∣
v
⃗
k
+
1
⋯
v
⃗
m
]
=
[
u
⃗
1
T
⋮
u
⃗
k
T
u
⃗
k
+
1
⋮
u
⃗
n
T
]
[
σ
1
0
0
⋱
σ
k
0
0
0
0
]
M\left[ \begin{array}{lll}{\vec{v}_{1}} & {\cdots} & {\vec{v}_{k}}\end{array}\right| \vec{v}_{k+1} \quad \cdots \quad \vec{v}_{m} ]= \left[ \begin{array}{c}{\vec{u}_{1}^{T}} \\ {\vdots} \\ {\frac{\vec{u}_{k}^{T}}{\vec{u}_{k+1}}} \\ {\vdots} \\ {\vec{u}_{n}^{T}}\end{array}\right] \left[ \begin{array}{ccc|c}\sigma_{1} & & 0 & 0\\ & {\ddots} & \sigma_{k} & 0 \\ \hline 0 & & 0 &0\end{array}\right]
M[v1⋯vk∣∣vk+1⋯vm]=⎣⎢⎢⎢⎢⎢⎢⎢⎡u1T⋮uk+1ukT⋮unT⎦⎥⎥⎥⎥⎥⎥⎥⎤⎣⎡σ10⋱0σk0000⎦⎤
M
=
[
u
⃗
1
⋯
u
⃗
k
]
[
σ
1
⋱
σ
k
]
[
v
⃗
1
T
⋮
v
⃗
k
T
]
+
[
u
⃗
k
+
1
⋯
u
⃗
m
]
[
0
]
[
v
⃗
k
+
1
T
⋮
v
⃗
n
T
]
M=\left[ \begin{array}{lll}{\vec{u}_{1}} & {\cdots} & {\vec{u}_{k}}\end{array}\right] \left [ \begin{array}{ccc}\sigma_{1} & & \\ & {\ddots} & \\ & & {\sigma_{k}}\end{array}\right] \left[ \begin{array}{c}{\vec{v}_{1}^{T}} \\ {\vdots} \\ {\vec{v}_{k}^{T}}\end{array}\right]+ \left[ \begin{array}{ccc}{\vec{u}_{k+1}} & {\cdots} & {\vec{u}_{m}}\end{array}\right] \left[\begin{array}{c} 0 \end{array} \right] \left[ \begin{array}{c}{\vec{v}_{k+1}^{T}} \\ {\vdots} \\ {\vec{v}_{n}^{T}}\end{array}\right]
M=[u1⋯uk]⎣⎡σ1⋱σk⎦⎤⎣⎢⎡v1T⋮vkT⎦⎥⎤+[uk+1⋯um][0]⎣⎢⎡vk+1T⋮vnT⎦⎥⎤
SVD算例
U:
A
A
T
AA^T
AAT的特征值和特征向量,用单位化的特征向量构成
U
U
U
V:
A
T
A
A^TA
ATA 的特征值和特征向量,用单位化的特征向量构成
V
V
V
∑
m
n
\sum_{mn}
∑mn : 将
A
A
T
AA^{T}
AAT或者
A
T
A
A^{T}A
ATA 的特征值求平方根,然后构成 Σ
以矩阵
A
=
[
1
1
1
1
0
0
]
A = \left[\begin{matrix} 1 & 1\\1 &1\\ 0 &0\\\end{matrix} \right]
A=⎣⎡110110⎦⎤
第一步 U ,下面是一种计算方法
对矩阵
A
A
T
=
[
2
2
0
2
2
0
0
0
0
]
A A^{T}=\left[ \begin{array}{lll}{2} & {2} & {0} \\ {2} & {2} & {0} \\ {0} & {0} & {0}\end{array}\right]
AAT=⎣⎡220220000⎦⎤特征分解,
特征是4,0,0
特征向量是
[
1
2
,
1
2
,
0
]
T
,
[
−
1
2
,
1
2
,
0
]
T
,
[
0
,
0
,
1
]
T
\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}
[21,21,0]T,[−21,21,0]T,[0,0,1]T,可得到
U
=
[
1
2
−
1
2
0
1
2
1
2
0
0
0
1
]
U=\left[ \begin{array}{ccc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} & {0} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}} & {0} \\ {0} & {0} & {1}\end{array}\right]
U=⎣⎡21210−21210001⎦⎤
第二步
计算矩阵
A
T
A
A^TA
ATA的特征分解,可得
特征值4,0,
V
=
[
1
2
−
1
2
1
2
1
2
]
V=\left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}}\end{array}\right]
V=[2121−2121]
第三步
计算
∑
m
n
\sum_{mn}
∑mn
Σ
=
[
2
0
0
0
0
0
]
\Sigma=\left[ \begin{array}{ll}{2} & {0} \\ {0} & {0} \\ {0} & {0}\end{array}\right]
Σ=⎣⎡200000⎦⎤
最后,
A
=
U
Σ
V
T
=
[
1
2
−
1
2
0
1
2
1
2
0
0
0
1
]
[
2
0
0
0
0
0
]
[
1
2
−
1
2
1
2
1
2
]
T
=
[
1
1
1
1
0
0
]
A=U \Sigma V^{T}=\left[ \begin{array}{ccc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} & {0} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}} & {0} \\ {0} & {0} & {1}\end{array}\right] \left[ \begin{array}{ll}{2} & {0} \\ {0} & {0} \\ {0} & {0}\end{array}\right] \left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}}\end{array}\right]^{T}=\left[ \begin{array}{cc}{1} & {1} \\ {1} & {1} \\ {0} & {0}\end{array}\right]
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 图像压缩
特征值分解和奇异值分解的区别
- 特征值分解只能是方阵,而奇异值分解是矩阵就可以
- 特征值分解只考虑了对矩阵缩放效果,奇异值分解对矩阵有选择、收缩、投影的效果