奇异值分解SVD

来源:互联网 发布:吉林国际软件 编辑:程序博客网 时间:2024/06/10 10:18

  原文地址以及另一篇SVD参考文章
  吴军的《数学之美》里其实已经介绍过用svd进行大数据的压缩了,不过我这里还是针对图像进行介绍一下吧。比如一幅1000*1000的图像A,存储就需要1000000个像素了。我们对A进行svd分解,则A=USV’,如果rank(A)=r,那么U就为1000*r的矩阵,S为r*r的矩阵,V为1000*r的矩阵。所以存储的数据就是1000*r+r*r+1000*r个数了,如果这个r比较小,那么存储的空间就会小很多了,当然了,如果r=1000,这时这样来算svd就是既浪费了空间又浪费了时间。所以用这个svd时,还是先看看它的秩为好。
  
  下面给出程序和运行结果,这里使用不同的特征分量对原图像进行重构,可以看一下效果。(这里悲剧的秩就是原图的宽)

clear all;close all;clc;a=imread('lena.jpg');imshow(mat2gray(a))[m n]=size(a);a=double(a);r=rank(a);[s v d]=svd(a);%re=s*v*d';re=s(:,:)*v(:,1:1)*d(:,1:1)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'1.jpg')re=s(:,:)*v(:,1:20)*d(:,1:20)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'2.jpg')re=s(:,:)*v(:,1:80)*d(:,1:80)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'3.jpg')re=s(:,:)*v(:,1:150)*d(:,1:150)';figure;imshow(mat2gray(re));imwrite(mat2gray(re),'4.jpg')

下面是效果图:
这里写图片描述
lena原图
这里写图片描述
只用第1个特征值进行重构
这里写图片描述
用前10个特征值进行重构
这里写图片描述
用前80个特征值进行重构
这里写图片描述
用前150个特征值进行重构

最后说一些奇异值分解的应用:
1.图像压缩,正如上面的。
2.噪声滤波。
3.模式识别。因为svd就是提取主要的成分嘛。
4.生物,物理,经济方面的一些统计模型的处理。