您的位置:首页 > 其它

SVD奇异值分解

2016-06-09 18:00 316 查看
矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition,简称SVD分解)得到。如果要问奇异值表示什么物理意义,那么就必须考虑在不同的实际工程应用中奇异值所对应的含义。

下面先尽量避开严格的数学符号推导,直观的从一张图片出发,让我们来看看奇异值代表什么意义。



图片实际上对应着一个矩阵,矩阵的大小就是像素大小,比如这张图对应的矩阵阶数就是1103*1620,矩阵上每个元素的数值对应着像素值。我们记这个像素矩阵为A

现在我们对矩阵进行奇异值分解。直观上,奇异值分解将矩阵分解成若干个秩一矩阵之和,用公式表示就是:

A=σ1u1vT1+σ2u2vT2+⋯+σrurvTr

其中等式右边每一项前的系数σi就是奇异值,ui和vi分别表示列向量,秩一矩阵的意思是矩阵秩为1。注意到每一项uivTi都是秩为1的矩阵。我们假定奇异值满足σ1⩾σ2⩾⋯⩾σr(奇异值大于0是个重要的性质,但这里先别在意),如果不满足的话重新排列顺序即可,这无非是编号顺序的问题。

既然奇异值有从大到小排列的顺序,我们自然要问,如果只保留大的奇异值,舍去较小的奇异值,这样(1)式里的等式自然不再成立,那会得到怎样的矩阵——也就是图像?

令A=σ1u1vT1,这只保留等式右边第一项,然后作图:



结果就是完全看不清是啥……多增加几项进来:

A20=∑i=120σiuivTi,再作图



在增加几项,看看A50的图像:



得到和原图差别不大的图像。也就是说当从1不断增大时,Ak不断的逼近A。

A=σ1u1vT1+σ2u2vT2+⋯+σrurvTr

矩阵表示一个1103*1620的矩阵,需要保存个1103*1620=1786860元素的值。等式右边ui和vi分别是1103*1和1620*1的向量,每一项有1+1103+1620=2724个元素。如果我们要存储很多高清的图片,而又受限于存储空间的限制,在尽可能保证图像可被识别的精度的前提下,我们可以保留奇异值较大的若干项,舍去奇异值较小的项即可。

从上面可以看到:奇异值往往对应着矩阵中隐含的重要信息,且重要性和奇异值大小正相关。每个矩阵都可以表示为一系列秩为1的“小矩阵”之和,而奇异值则衡量了这些“小矩阵”对于的权重

代码:

from PIL import Image
from matplotlib.pylab import *
import numpy as np

date=np.array(Image.open(r'C:\Users\Selena\Desktop\test\test.jpg').convert('L'))
U,s,V=np.linalg.svd(date,full_matrices=False)
S=np.diag(s)
indice=1
imshow(np.dot(U[:,0:indice],np.dot(S[0:indice,0:indice],V[0:indice,:])))
indice=20
imshow(np.dot(U[:,0:indice],np.dot(S[0:indice,0:indice],V[0:indice,:])))
indice=50
imshow(np.dot(U[:,0:indice],np.dot(S[0:indice,0:indice],V[0:indice,:])))


奇异值分解证明

假设m×n矩阵A的秩为k,{v1,v2,…,vn}为n×n阶实堆成矩阵ATA的特征向量,并且已经标准正交化,即vTivj=δij,对应的特征值为{λ1,…,λk,0,…,0}

那么A矩阵将这组标准正交基映射为:{Av1,…,Avk,0,…,0},

(Avi)TAvj=λjvTivj=λjδij

即映射后的向量是两两正交的,并且λ2i=(Avi)TAvi

取单位向量ui=Avi||Avi||2=1λi−−√Avi

那么得到Avi=σiui,σi=λi−−√,0⩽i⩽k,k=Rank(A)

将{u1,u2,…,uk}标准正交基扩展成{u1,u2,…,um}Rm空间的标准正交基,在A的零空间中选取{vk+1,…,vn}使得Avi=0,i>k,并取σi=0

可得到

A[v1,…,vk|vk+1,…,vn]=[u1,…,uk|uk+1,…,um]⎛⎝⎜⎜⎜⎜⎜σ1⋱σk000⎞⎠⎟⎟⎟⎟⎟

从而得到A矩阵的分解A=UΣVT(奇异值分解),其中U是m×m标准正交矩阵,V是n×n阶正交矩阵,Σ是m×n矩阵

注意:vi是ATA的标准特征向量,称A的右奇异向量,ui是AAT的标准特征向量,称A的左奇异向量,并且ui=Avi/||Avi||2,σi≠0和vi=Aui/||Aui||2,σi≠0

算法思路

利用QR分解算AAT特征值和特征向量(持续更新)

奇异值分解与特征值分解

矩阵可以认为是一种线性变换的表示,而且这种线性变换的作用效果与基的选择有关,确定了定义域空间和目标空间的两组基,就可以写出该线性变换的矩阵表示。

以Ax=b为例,x是m维向量,b是n维向量,m,n可以相等也可以不相等,表示矩阵可以将一个向量线性变换到另一个向量,这样一个线性变换的作用可以包含旋转缩放投影三种类型的效应。

奇异值分解正是对线性变换这三种效应的一个析构。

A=UΣVT,U和V是两组正交单位向量,|Sigma是对角阵,表示奇异值,它表示我们找到了U和V这样两组基,A矩阵的作用是将一个向量从U这组正交基向量的空间旋转到V这组正交基向量空间,并对每个方向进行了一定的缩放,缩放因子就是各个奇异值。如果维度比大,则表示还进行了投影。可以说奇异值分解将一个矩阵原本混合在一起的三种作用效果,分解出来了。

而特征值分解其实是对旋转缩放两种效应的归并。(有投影效应的矩阵不是方阵,没有特征值)

特征值,特征向量由Ax=x得到,它表示如果一个向量v处于A的特征向量方向,那么Av对v的线性变换作用只是一个缩放。也就是说,求特征向量和特征值的过程,我们找到了这样一组基,在这组基下,矩阵的作用效果仅仅是存粹的缩放。对于实对称矩阵,特征向量正交,我们可以将特征向量式子写成A=UΛUT,这样就和奇异值分解类似了,就是A矩阵将一个向量从U这组基的空间旋转到U这组基的空间,并在每个方向进行了缩放,由于前后都是U,就是没有旋转或者理解为旋转了0度。

总结一下,特征值分解和奇异值分解都是给一个矩阵(线性变换)找一组特殊的基,特征值分解找到了特征向量这组基,在这组基下该线性变换只有缩放效果。而奇异值分解则是找到另一组基,这组基下线性变换的旋转、缩放、投影三种功能独立地展示出来了。

应用:图像处理领域:数据压缩,对图像去噪;机器学习:PCA

参考:

1. https://www.zhihu.com/question/19666954

2. http://www.ams.org/samplings/feature-column/fcarc-svd
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: