【尊重原创,转载请注明出处】https://blog.csdn.net/zpalyq110/article/details/86751064
1. 简介
奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。本文通过分析原理,推导公式,以及具体实例演示来总结一下SVD。
必备线性代数基础:
- 方阵:行数等于列数的矩阵
- 对角阵:只有对角线上有非0元素的矩阵
- 对称阵:元素以主对角线为对称轴对应相等的矩阵,总能相似对角化,其不同特征值对应的特征向量两两正交
- 正交阵:满足 A A T = E AA^T=E AAT=E或者 A T A = E A^T A=E ATA=E的n阶方阵A,其中E为n阶单位阵。满足性质 A T = A − 1 A^T = A^{-1} AT=A−1,任意两向量点乘等于0,即 ( x i ⋅ x j ) = 0 (x_i · x_j)=0 (xi⋅xj)=0,同一向量点乘等于1,即 ( x i ⋅ x i ) = ∣ x i ∣ 2 = 1 (x_i·x_i) = |x_i|^2 = 1 (xi⋅xi)=∣xi∣2=1.
- 任意矩阵 A A A, A T A A^TA ATA为对称阵
2. 特征值分解(EVD-eigenvalue decomposition)
2.1 特征值和特征向量
设
A
A
A是n阶矩阵,λ是一个数,若存在n维非零向量x,使得
A
x
=
λ
x
(
x
≠
0
)
Ax = λx (x≠0)
Ax=λx (x̸=0)则称λ是A的特征值,x是A的对应于λ的特征向量。
一个矩阵通常可以由其特征值和特征向量完全描述,那特征向量是在方向不变的条件下简单地乘以一个缩放因子的非零向量,特征向量对应的特征值是它所乘的那个缩放因子。
2.2 特征值分解
既然我们知道一个矩阵是可以通过特征值和特征向量来表示,那假设存在一个n×n的满秩对称矩阵A,我们便可以通过特征值将A分解。
首先求出A的n个特征值
λ
1
,
λ
2
 
.
.
.
,
λ
n
\lambda_1, \lambda_2 \, ... , \lambda_n
λ1,λ2...,λn以及对应的特征向量(此处指标准化处理后)
x
1
,
x
2
,
.
.
.
x
n
x_1,x_2,...x_n
x1,x2,...xn即
A
x
1
=
λ
1
x
1
Ax_1 = \lambda_1x_1
Ax1=λ1x1
A
x
2
=
λ
2
x
2
Ax_2 = \lambda_2x_2
Ax2=λ2x2
.
.
.
.
.
.
......
......
A
x
n
=
λ
n
x
n
Ax_n = \lambda_nx_n
Axn=λnxn此时我们用
U
U
U表示特征向量组成的矩阵
A
U
=
U
Λ
AU = U\Lambda
AU=UΛ
U
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
U=[x_1, x_2,...,x_n]
U=[x1,x2,...,xn]
Λ
=
[
λ
1
λ
2
λ
3
]
\Lambda=\begin{bmatrix} \lambda_1 & & \\ & \lambda_2 & \\ & & \lambda_3 \end{bmatrix}
Λ=⎣⎡λ1λ2λ3⎦⎤这里重点说一下
U
U
U,因为
U
U
U是对称阵的特征向量,所以内部两两向量是正交,并且刚才标准化处理过,此时
U
U
U就成了正交阵,根据前面提到的性质,
U
T
=
U
−
1
U^T=U^{-1}
UT=U−1,即
A
=
U
Λ
U
−
1
=
U
Λ
U
T
A= U\Lambda U^{-1}= U\Lambda U^T
A=UΛU−1=UΛUT
到此,特征值分解过程结束。
3. 奇异值分解(SVD-singular value decomposition)
在特征值分解时,A是n×n的满秩对称矩阵,那如果是一个m×n的普通矩阵呢?这时再想分解矩阵A,就需要SVD了。
此时的A只是一个m×n的普通矩阵,但是
A
T
A
A^TA
ATA呢?没错
A
T
A
A^TA
ATA是对称阵!所以我们又可以根据EVD的来分解
A
T
A
A^TA
ATA了!
(刚刚在第2部分中关于A的强假设是为了在此处伏笔,其实对于特征值分解A没必要是对称阵。)
首先求出
A
T
A
A^TA
ATA的n个特征值
λ
1
,
λ
2
 
.
.
.
,
λ
n
\lambda_1, \lambda_2 \, ... , \lambda_n
λ1,λ2...,λn以及对应的特征向量(此处指标准化处理后)
x
1
,
x
2
,
.
.
.
x
n
x_1,x_2,...x_n
x1,x2,...xn即
A
T
A
x
1
=
λ
1
x
1
A^TAx_1 = \lambda_1x_1
ATAx1=λ1x1
A
T
A
x
2
=
λ
2
x
2
A^TAx_2 = \lambda_2x_2
ATAx2=λ2x2
.
.
.
.
.
.
......
......
A
T
A
x
n
=
λ
n
x
n
A^TAx_n = \lambda_nx_n
ATAxn=λnxn此时我们用
V
V
V表示特征向量组成的矩阵
A
T
A
V
=
V
Λ
A^TAV = V\Lambda
ATAV=VΛ
V
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
V=[x_1, x_2,...,x_n]
V=[x1,x2,...,xn]
Λ
=
[
λ
1
λ
2
λ
3
]
\Lambda=\begin{bmatrix} \lambda_1 & & \\ & \lambda_2 & \\ & & \lambda_3 \end{bmatrix}
Λ=⎣⎡λ1λ2λ3⎦⎤即
A
T
A
=
V
Λ
V
T
A^TA =V\Lambda V^T
ATA=VΛVT此时
V
V
V是正交阵,任取两个特征向量
x
i
,
x
j
x_i, x_j
xi,xj可得
(
x
i
⋅
x
j
)
=
0
(x_i·x_j) = 0
(xi⋅xj)=0,
(
x
i
⋅
x
i
)
=
1
(x_i·x_i) = 1
(xi⋅xi)=1
下面我们来探究一下
A
V
AV
AV是不是正交阵?
满足正交阵第一个条件,两两向量正交:
A
v
i
⋅
A
v
j
=
(
A
v
i
)
T
A
v
j
=
v
i
T
A
T
A
v
j
=
v
i
T
λ
j
v
j
=
λ
j
v
i
⋅
v
j
=
0
Av_i·Av_j = (Av_i)^TAv_j=v_i^TA^TAv_j=v_i^T\lambda _jv_j=\lambda _jv_i·v_j=0
Avi⋅Avj=(Avi)TAvj=viTATAvj=viTλjvj=λjvi⋅vj=0
第二个条件,各个向量为单位长度:
A
v
i
⋅
A
v
i
=
λ
i
v
i
⋅
v
i
=
λ
i
Av_i·Av_i = \lambda _iv_i·v_i=\lambda _i
Avi⋅Avi=λivi⋅vi=λi
∣
A
v
i
∣
2
=
λ
i
|Av_i|^2 = \lambda _i
∣Avi∣2=λi去单位向量:
A
v
i
∣
A
v
i
∣
=
A
v
i
1
λ
i
=
u
i
\frac{Av_i}{|Av_i|}=Av_i \frac{1}{\sqrt{\lambda _i}}=u_i
∣Avi∣Avi=Aviλi1=ui令
λ
i
=
σ
i
\sqrt{\lambda _i}= \sigma_i
λi=σi
A
v
i
=
u
i
σ
i
Av_i=u_i\sigma_i
Avi=uiσi把
i
i
i去掉,写成集合此时A的奇异值分解:
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT个人理解:特征值分解是在一个标准正交基里面进行分解,而奇异值分解是通过两个标准正交基进行分解。
4. 实例操作
4.1 计算方法以及证明
首先分析
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT中的结构组成,
A
m
×
n
,
U
m
×
m
,
Σ
m
×
n
,
V
n
×
n
T
A_{m×n},U_{m×m},\Sigma_{m×n},V^T_{n×n}
Am×n,Um×m,Σm×n,Vn×nT
然后根据上一部分的公式推倒,
V
V
V就是
A
T
A
A^TA
ATA的特征向量,同理
U
U
U就是
A
A
T
AA^T
AAT的特征向量,所以想要得到
V
和
U
V和U
V和U就得计算
A
T
A
和
A
A
T
A^TA和AA^T
ATA和AAT的特征向量,而
Σ
\Sigma
Σ通过任意一组计算即可,计算时你会发现两组特征值重叠。
下面证明一下
V
V
V就是
A
T
A
A^TA
ATA的特征向量,
U
U
U就是
A
A
T
AA^T
AAT的特征向量。
A
=
U
Σ
V
T
A=U\Sigma V^T
A=UΣVT
A
T
=
V
Σ
T
U
T
A^T=V\Sigma^T U^T
AT=VΣTUT
A
T
A
=
V
Σ
T
U
T
U
Σ
V
T
=
V
Σ
2
V
T
=
V
Λ
V
T
A^TA = V\Sigma^T U^TU\Sigma V^T = V\Sigma^2V^T = V\Lambda V^T
ATA=VΣTUTUΣVT=VΣ2VT=VΛVT可以仔细对比一下第3部分公式的符号,研究下为什么
Σ
2
=
Λ
\Sigma^2=\Lambda
Σ2=Λ
此时证明完毕,
V
V
V就是
A
T
A
A^TA
ATA的特征向量,同理
U
U
U就是
A
A
T
AA^T
AAT的特征向量。
4. 实例计算
分解矩阵 A A A,其定义如下: A = ( 1 0 2 1 0 1 ) \mathbf{A} = \left( \begin{array}{ccc} 1& 0\\ 2& 1\\ 0& 1 \end{array} \right) A=⎝⎛120011⎠⎞首先计算 A T A 和 A A T A^TA和AA^T ATA和AAT A T A = ( 1 2 0 0 1 1 ) ( 1 0 2 1 0 1 ) = ( 5 2 2 2 ) \mathbf{A^TA} = \left( \begin{array}{ccc} 1& 2 &0\\ 0&1& 1 \end{array} \right) \left( \begin{array}{ccc} 1& 0\\ 2& 1\\ 0& 1 \end{array} \right) = \left( \begin{array}{ccc} 5& 2 \\ 2& 2 \end{array} \right) ATA=(102101)⎝⎛120011⎠⎞=(5222) A A T = ( 1 0 2 1 0 1 ) ( 1 2 0 0 1 1 ) = ( 1 2 0 2 5 1 0 1 1 ) \mathbf{AA^T} = \left( \begin{array}{ccc} 1& 0\\ 2& 1\\ 0& 1 \end{array} \right) \left( \begin{array}{ccc} 1& 2 &0\\ 0&1& 1 \end{array} \right) = \left( \begin{array}{ccc} 1& 2 & 0\\ 2& 5 & 1\\ 0& 1& 1 \end{array} \right) AAT=⎝⎛120011⎠⎞(102101)=⎝⎛120251011⎠⎞计算 A T A A^TA ATA的特征值和特征向量 λ 1 = 6 ; v 1 = ( 2 / 5 1 / 5 ) ; λ 2 = 1 ; v 2 = ( − 1 / 5 2 / 5 ) \lambda_1= 6; v_1 = \left( \begin{array}{ccc} 2/\sqrt{5} \\ 1/\sqrt{5} \end{array} \right); \lambda_2= 1; v_2 = \left( \begin{array}{ccc} -1/\sqrt{5} \\ 2/\sqrt{5} \end{array} \right) λ1=6;v1=(2/51/5);λ2=1;v2=(−1/52/5)计算 A A T AA^T AAT的特征值和特征向量 λ 1 = 6 ; u 1 = ( 2 / 30 5 / 30 1 / 30 ) ; λ 2 = 1 ; u 2 = ( 1 / 5 0 − 2 / 5 ) ; λ 3 = 0 ; u 3 = ( 2 / 6 1 / 6 − 1 / 6 ) \lambda_1= 6; u_1 = \left( \begin{array}{ccc} 2/\sqrt{30} \\ 5/\sqrt{30} \\ 1/\sqrt{30} \end{array} \right); \lambda_2= 1; u_2 = \left( \begin{array}{ccc} 1/\sqrt{5} \\ 0 \\ -2/\sqrt{5} \end{array} \right); \lambda_3= 0; u_3 = \left( \begin{array}{ccc} 2/\sqrt{6} \\ 1/\sqrt{6} \\ -1/\sqrt{6} \end{array} \right) λ1=6;u1=⎝⎛2/305/301/30⎠⎞;λ2=1;u2=⎝⎛1/50−2/5⎠⎞;λ3=0;u3=⎝⎛2/61/6−1/6⎠⎞计算奇异值: σ 1 = λ 1 = 6 \sigma_1 = \sqrt{\lambda_1}=\sqrt 6 σ1=λ1=6 σ 2 = λ 2 = 1 \sigma_2 = \sqrt{\lambda_2}=1 σ2=λ2=1最终得到A的奇异值分解: A = U Σ V T = ( 2 / 30 1 / 5 2 / 6 5 / 30 0 1 / 6 1 / 30 − 2 / 5 − 1 / 6 ) ( 6 0 0 1 0 0 ) ( 2 / 5 − 1 / 5 1 / 5 2 / 5 ) A=U\Sigma V^T = \left( \begin{array}{ccc} 2/\sqrt{30} & 1/\sqrt{5} & 2/\sqrt{6} \\ 5/\sqrt{30} & 0 & 1/\sqrt{6}\\ 1/\sqrt{30} & -2/\sqrt{5} & -1/\sqrt{6} \end{array} \right) \left( \begin{array}{ccc} \sqrt{6} & 0 \\ 0 & 1\\ 0 & 0 \end{array} \right) \left( \begin{array}{ccc} 2/\sqrt{5} & -1/\sqrt{5} \\ 1/\sqrt{5} & 2/\sqrt{5} \end{array} \right) A=UΣVT=⎝⎛2/305/301/301/50−2/52/61/6−1/6⎠⎞⎝⎛600010⎠⎞(2/51/5−1/52/5)
5. 应用
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上的比例。也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:
A
m
×
n
=
U
m
×
m
Σ
m
×
n
V
n
×
n
T
≈
U
m
×
k
Σ
k
×
k
V
k
×
n
T
A_{m \times n} = U_{m \times m}\Sigma_{m \times n} V^T_{n \times n} \approx U_{m \times k}\Sigma_{k \times k} V^T_{k \times n}
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nT
如图所示:
在矩阵
A
A
A非常巨大系数的时候,我们可以利用SVD取前K个终于的特征值进行存储,应用场景:PCA降维,推荐系统,NLP隐含语义分析等等。