【尊重原创,转载请注明出处】https://blog.****.net/zpalyq110/article/details/86751064
1. 简介
奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它不仅可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。本文通过分析原理,推导公式,以及具体实例演示来总结一下SVD。
必备线性代数基础:
- 方阵:行数等于列数的矩阵
- 对角阵:只有对角线上有非0元素的矩阵
- 对称阵:元素以主对角线为对称轴对应相等的矩阵,总能相似对角化,其不同特征值对应的特征向量两两正交
- 正交阵:满足AAT=E或者ATA=E的n阶方阵A,其中E为n阶单位阵。满足性质AT=A−1,任意两向量点乘等于0,即(xi⋅xj)=0,同一向量点乘等于1,即(xi⋅xi)=∣xi∣2=1.
- 任意矩阵A,ATA为对称阵
2. 特征值分解(EVD-eigenvalue decomposition)
2.1 特征值和特征向量
设A是n阶矩阵,λ是一个数,若存在n维非零向量x,使得
Ax=λx (x̸=0)则称λ是A的特征值,x是A的对应于λ的特征向量。
一个矩阵通常可以由其特征值和特征向量完全描述,那特征向量是在方向不变的条件下简单地乘以一个缩放因子的非零向量,特征向量对应的特征值是它所乘的那个缩放因子。
2.2 特征值分解
既然我们知道一个矩阵是可以通过特征值和特征向量来表示,那假设存在一个n×n的满秩对称矩阵A,我们便可以通过特征值将A分解。
首先求出A的n个特征值λ1,λ2...,λn以及对应的特征向量(此处指标准化处理后)x1,x2,...xn即Ax1=λ1x1Ax2=λ2x2......Axn=λnxn此时我们用U表示特征向量组成的矩阵AU=UΛU=[x1,x2,...,xn]Λ=⎣⎡λ1λ2λ3⎦⎤这里重点说一下U,因为U是对称阵的特征向量,所以内部两两向量是正交,并且刚才标准化处理过,此时U就成了正交阵,根据前面提到的性质,UT=U−1,即A=UΛU−1=UΛUT
到此,特征值分解过程结束。
3. 奇异值分解(SVD-singular value decomposition)
在特征值分解时,A是n×n的满秩对称矩阵,那如果是一个m×n的普通矩阵呢?这时再想分解矩阵A,就需要SVD了。
此时的A只是一个m×n的普通矩阵,但是ATA呢?没错ATA是对称阵!所以我们又可以根据EVD的来分解ATA了!
(刚刚在第2部分中关于A的强假设是为了在此处伏笔,其实对于特征值分解A没必要是对称阵。)
首先求出ATA的n个特征值λ1,λ2...,λn以及对应的特征向量(此处指标准化处理后)x1,x2,...xn即ATAx1=λ1x1ATAx2=λ2x2......ATAxn=λnxn此时我们用V表示特征向量组成的矩阵ATAV=VΛV=[x1,x2,...,xn]Λ=⎣⎡λ1λ2λ3⎦⎤即ATA=VΛVT此时V是正交阵,任取两个特征向量xi,xj可得(xi⋅xj)=0,(xi⋅xi)=1
下面我们来探究一下AV是不是正交阵?
满足正交阵第一个条件,两两向量正交:
Avi⋅Avj=(Avi)TAvj=viTATAvj=viTλjvj=λjvi⋅vj=0
第二个条件,各个向量为单位长度:
Avi⋅Avi=λivi⋅vi=λi∣Avi∣2=λi去单位向量:∣Avi∣Avi=Aviλi1=ui令λi=σiAvi=uiσi把i去掉,写成集合此时A的奇异值分解:A=UΣVT个人理解:特征值分解是在一个标准正交基里面进行分解,而奇异值分解是通过两个标准正交基进行分解。
4. 实例操作
4.1 计算方法以及证明
首先分析A=UΣVT中的结构组成,Am×n,Um×m,Σm×n,Vn×nT
然后根据上一部分的公式推倒,V就是ATA的特征向量,同理U就是AAT的特征向量,所以想要得到V和U就得计算ATA和AAT的特征向量,而Σ通过任意一组计算即可,计算时你会发现两组特征值重叠。
下面证明一下V就是ATA的特征向量,U就是AAT的特征向量。
A=UΣVTAT=VΣTUTATA=VΣTUTUΣVT=VΣ2VT=VΛVT可以仔细对比一下第3部分公式的符号,研究下为什么 Σ2=Λ
此时证明完毕,V就是ATA的特征向量,同理U就是AAT的特征向量。
4. 实例计算
分解矩阵A,其定义如下:A=⎝⎛120011⎠⎞首先计算ATA和AAT ATA=(102101)⎝⎛120011⎠⎞=(5222)AAT=⎝⎛120011⎠⎞(102101)=⎝⎛120251011⎠⎞计算ATA的特征值和特征向量λ1=6;v1=(2/51/5);λ2=1;v2=(−1/52/5)计算AAT的特征值和特征向量λ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σ2=λ2=1最终得到A的奇异值分解: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个的奇异值和对应的左右奇异向量来近似描述矩阵。也就是说:Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nT
如图所示:
在矩阵A非常巨大系数的时候,我们可以利用SVD取前K个终于的特征值进行存储,应用场景:PCA降维,推荐系统,NLP隐含语义分析等等。
推荐资料
- SVD paper
- 几何角度看SVD