SVD分解
先来一道题开开胃
W
=
[
4
0
5
0
0
5
]
W=\left[\begin{array}{lll}4 & 0 & 5 \\ 0 & 0 & 5\end{array}\right] \quad
W=[40?00?55?] Find
W
=
U
Σ
V
T
=
λ
1
u
?
1
(
v
?
1
)
T
+
λ
2
u
?
2
(
v
?
2
)
T
W=U \Sigma V^{T}=\sqrt{\lambda_{1}} \vec{u}_{1}\left(\vec{v}_{1}\right)^{T}+\sqrt{\lambda_{2}} \vec{u}_{2}\left(\vec{v}_{2}\right)^{T}
W=UΣVT=λ1?
?u
1?(v
1?)T+λ2?
?u
2?(v
2?)T
C
=
W
T
W
=
V
D
V
T
=
V
Σ
T
Σ
V
T
=
(
V
Σ
T
U
T
)
(
U
Σ
V
T
)
C=W^{T} W=V D V^{T}=V \Sigma^{T} \Sigma V^{T}=\left(V \Sigma^{T}U^{T}\right)\left(U \Sigma V^{T}\right)
C=WTW=VDVT=VΣTΣVT=(VΣTUT)(UΣVT)
B
=
W
W
T
=
U
D
U
T
=
U
Σ
T
Σ
U
T
=
(
U
Σ
T
V
T
)
(
V
Σ
U
T
)
B=W W^{T}=U D U^{T}=U \Sigma^{T} \Sigma U^{T}=\left(U \Sigma^{T} V^{T}\right)\left(V \Sigma U^{T}\right)
B=WWT=UDUT=UΣTΣUT=(UΣTVT)(VΣUT)
B
=
[
4
0
5
0
0
5
]
[
4
0
0
0
5
5
]
=
[
41
25
25
25
]
=
[
0.81
?
0.59
0.59
0.81
]
[
59.2
0
0
6.75
]
[
0.81
0.59
?
0.59
0.81
]
B=\left[\begin{array}{lll}4 & 0 & 5 \\ 0 & 0 & 5\end{array}\right]\left[\begin{array}{ll}4 & 0 \\ 0 & 0 \\ 5 & 5\end{array}\right]=\left[\begin{array}{ll}41 & 25 \\ 25 & 25\end{array}\right]=\left[\begin{array}{cc}0.81 & -0.59 \\ 0.59 & 0.81\end{array}\right]\left[\begin{array}{cc}59.2 & 0 \\ 0 & 6.75\end{array}\right]\left[\begin{array}{cc}0.81 & 0.59 \\ -0.59 & 0.81\end{array}\right]
B=[40?00?55?]???405?005????=[4125?2525?]=[0.810.59??0.590.81?][59.20?06.75?][0.81?0.59?0.590.81?]
求出特征值及特征向量
[
4
0
5
0
0
5
]
=
[
0.81
?
0.59
0.59
0.81
]
[
7.70
0
0
0
2.60
0
]
[
0.42
0
0.91
?
0.91
0
0.42
0
1
0
]
\left[\begin{array}{lll}4 & 0 & 5 \\ 0 & 0 & 5\end{array}\right]=\left[\begin{array}{cc}0.81 & -0.59 \\ 0.59 & 0.81\end{array}\right]\left[\begin{array}{ccc}7.70 & 0 & 0 \\ 0 & 2.60 & 0\end{array}\right]\left[\begin{array}{ccc}0.42 & 0 & 0.91 \\ -0.91 & 0 & 0.42 \\ 0 & 1 & 0\end{array}\right]
[40?00?55?]=[0.810.59??0.590.81?][7.700?02.60?00?]???0.42?0.910?001?0.910.420????
=
7.70
[
0.81
0.59
]
[
0.42
0
0.91
]
+
2.6
[
0.59
0.81
]
[
?
0.91
0
0.42
]
=7.70\left[\begin{array}{l}0.81 \\ 0.59\end{array}\right]\left[\begin{array}{lll}0.42 & 0 & 0.91\end{array}\right]+2.6\left[\begin{array}{l}0.59 \\ 0.81\end{array}\right]\left[\begin{array}{lll}-0.91 & 0 & 0.42\end{array}\right]
=7.70[0.810.59?][0.42?0?0.91?]+2.6[0.590.81?][?0.91?0?0.42?]
=
[
2.62
0
5.68
1.91
0
4.12
]
+
[
1.38
0
?
0.64
?
1.91
0
0.88
]
=\left[\begin{array}{lll}2.62 & 0 & 5.68 \\ 1.91 & 0 & 4.12\end{array}\right]+\left[\begin{array}{ccc}1.38 & 0 & -0.64 \\ -1.91 & 0 & 0.88\end{array}\right]
=[2.621.91?00?5.684.12?]+[1.38?1.91?00??0.640.88?]
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。
1.回顾特征值和特征向量
首先回顾下特征值和特征向量的定义如下:
A
x
=
λ
x
A x=\lambda x
Ax=λx
其中
A
A
A 是一个
n
×
n
n \times n
n×n 矩阵,
x
x
x 是一个
n
n
n 维向量,则
λ
\lambda
λ 是矩阵
A
A
A 的一个特征值,而
x
x
x 是矩阵
A
A
A 的特征值
λ
\lambda
λ 所对应的特征向量。
求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵
A
A
A 特征分解。如果我们求出了矩阵
A
A
A 的n个特征值
λ
1
≤
λ
2
≤
…
≤
λ
n
\lambda_{1} \leq \lambda_{2} \leq \ldots \leq \lambda_{n}
λ1?≤λ2?≤…≤λn?,以及这
n
n
n 个特征值所对应的特征向量
w
1
,
w
2
,
…
,
w
n
w_{1}, w_{2}, \ldots, w_{n}
w1?,w2?,…,wn? ,
那么矩阵A就可以用下式的特征分解表示:
A
=
W
Σ
W
?
1
A=W \Sigma W^{-1}
A=WΣW?1
其中
W
W
W 是这
n
n
n 个特征向量所张成的
n
×
n
n×n
n×n维矩阵,而
Σ
\Sigma
Σ 为这
n
n
n个特征值为主对角线的
n
×
n
n×n
n×n维矩阵。
一般我们会把
W
W
W的这
n
n
n个特征向量标准化,即满足
∥
w
i
∥
2
=
1
\left\|w_{i}\right\|_{2}=1
∥wi?∥2?=1 ,或者
w
i
T
w
i
=
1
w_{i}^{T} w_{i}=1
wiT?wi?=1,此时
W
W
W 的
n
n
n 特征向量为标准正交基,满足
W
T
W
=
I
W^{T} W=I
WTW=I ,即
W
T
=
W
?
1
W^{T}=W^{-1}
WT=W?1,也就是说
W
W
W 为酉矩阵。
这样我们的特征分解表达式可以写成
A
=
W
Σ
W
T
A=W \Sigma W^{T}
A=WΣWT
注意到要进行特征分解,矩阵A必须为方阵。 那么如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?答案是可以,此时我们的SVD登场了。
2. SVD定义
SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD为:
A
=
U
Σ
V
T
A=U \Sigma V^{T}
A=UΣVT
其中
U
U
U 是一个
m
×
m
m \times m
m×m 的矩阵,
Σ
\Sigma
Σ 是一个
m
×
n
m \times n
m×n 的矩阵,除了主对角线上的元素以外全为
0
0
0,主对角线上的每个元素都称为奇异值,
V
V
V 是一个
n
×
n
n \times n
n×n 的矩阵。
U
U
U和
V
V
V 都是酉矩阵,即满足。
下图可以很形象的看出上面SVD的定义:
U
T
U
=
I
,
V
T
V
=
I
U^{T} U=I, V^{T} V=I
UTU=I,VTV=I
那么我们如何求出SVD分解后的
U
,
Σ
,
V
U,Σ,V
U,Σ,V这三个矩阵呢?
如果我们将
A
A
A的转置和
A
A
A做矩阵乘法,那么会得到
n
×
n
n×n
n×n的一个方阵
A
T
A
A^{T} A
ATA 。既然
A
T
A
A^{T} A
ATA是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
(
A
T
A
)
v
i
=
λ
i
v
i
\left(A^{T} A\right) v_{i}=\lambda_{i} v_{i}
(ATA)vi?=λi?vi?
这样我们就可以得到矩阵
A
T
A
A^{T} A
ATA 的
n
n
n个特征值和对应的
n
n
n个特征向量
v
v
v了。将
A
T
A
A^{T} A
ATA 的所有特征向量张成一个
n
×
n
n×n
n×n的矩阵
V
V
V,就是我们SVD公式里面的
V
V
V矩阵了。一般我们将
V
V
V中的每个特征向量叫做
A
A
A的右奇异向量。
如果我们将
A
A
A和
A
A
A的转置做矩阵乘法,那么会得到
m
×
m
m×m
m×m的一个方阵
A
A
T
A A^{T}
AAT。既然
A
A
T
A A^{T}
AAT 是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
(
A
A
T
)
u
i
=
λ
i
u
i
\left(A A^{T}\right) u_{i}=\lambda_{i} u_{i}
(AAT)ui?=λi?ui?
这样我们就可以得到矩阵
A
A
T
AA^{T}
AAT 的
m
m
m个特征值和对应的
m
m
m个特征向量
u
u
u了。将
A
A
T
AA^{T}
AAT 的所有特征向量张成一个
m
×
m
m×m
m×m的矩阵
U
U
U,就是我们SVD公式里面的
U
U
U矩阵了。一般我们将
U
U
U中的每个特征向量叫做
A
A
A的左奇异向量。
U
U
U和
V
V
V我们都求出来了,现在就剩下奇异值矩阵
Σ
Σ
Σ没有求出了.
由于
Σ
Σ
Σ除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值
σ
σ
σ就可以了。
我们注意到:
A
=
U
Σ
V
T
?
A
V
=
U
Σ
V
T
V
?
A
V
=
U
Σ
?
A
v
i
=
σ
i
u
i
?
σ
i
=
A
v
i
/
u
i
A=U \Sigma V^{T} \Rightarrow A V=U \Sigma V^{T} V \Rightarrow A V=U \Sigma \Rightarrow A v_{i}=\sigma_{i} u_{i} \Rightarrow \sigma_{i}=A v_{i} / u_{i}
A=UΣVT?AV=UΣVTV?AV=UΣ?Avi?=σi?ui??σi?=Avi?/ui?
这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵
Σ
Σ
Σ。
上面还有一个问题没有讲,就是我们说
A
T
A
A^{T}A
ATA 的特征向量组成的就是我们SVD中的
V
V
V矩阵,而
A
A
T
AA^{T}
AAT的特征向量组成的就是我们SVD中的
U
U
U矩阵,这有什么根据吗?这个其实很容易证明,我们以
V
V
V矩阵的证明为例。
A
=
U
Σ
V
T
?
A
T
=
V
Σ
U
T
?
A
T
A
=
V
Σ
U
T
U
Σ
V
T
=
V
Σ
2
V
T
A=U \Sigma V^{T} \Rightarrow A^{T}=V \Sigma U^{T} \Rightarrow A^{T} A=V \Sigma U^{T} U \Sigma V^{T}=V \Sigma^{2} V^{T}
A=UΣVT?AT=VΣUT?ATA=VΣUTUΣVT=VΣ2VT
类似的方法可以得到
A
A
T
AA^{T}
AAT的特征向量组成的就是我们SVD中的
U
U
U 矩阵。
进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
σ
i
=
λ
i
\sigma_{i}=\sqrt{\lambda_{i}}
σi?=λi?
?
这样也就是说,我们可以用
σ
i
=
A
v
i
u
i
\sigma_{i}=\frac{A v_{i}}{u_{i}}
σi?=ui?Avi?? 来计算奇异值,也可以通过求出
A
T
A
A^{T} A
ATA 的特征值取平方根来求奇异值。
https://zhuanlan.zhihu.com/p/29846048
|