svf程序分析 sv define_svd奇异值分解


奇异值分解就是在低维空间中寻找最接近原矩阵


的低维矩阵

,说白了就是数据降维。


奇异值分解是一种十分重要但又难以理解的矩阵处理技术,据人工智能的大牛吴恩达老师所说,在机器学习中是最重要的分解没有之一的存在。那么,奇异值分解到底是在干什么呢?

矩阵


表示的是高维数据,通常情况下高维数据分布并不是雨露均沾的,而往往是厚此薄彼,集中分布在某些维度上,如下图


svf程序分析 sv define_矩阵的奇异值分解_02


虽然原始数据的的确确是二维数据,但是其实主要集中分布在直线


(一维空间)附近,在这里,SVD(奇异值分解)其实就是在寻找直线


,然后将数据映射到直线


上,实现数据降维的过程,即如下图


svf程序分析 sv define_矩阵的奇异值分解_03


于是,通过SVD(奇异值分解),就可以利用降维后的数据近似地替代原始数据。所以,SVD(奇异值分解)其实就是在寻找数据分布的主要维度,将原始的高维数据映射到低维子空间中实现数据降维。

数学上来说,若一


矩阵


,其秩为


,通过奇异值分解可求一个低秩矩阵


(


),在弗罗贝尼乌斯范数意义下最接近原矩阵


。弗罗贝尼乌斯范数定义如下:



显然,两个矩阵各个元素越接近,弗罗贝尼乌斯范数就越接近,而矩阵的秩


表示矩阵的维度,所以通俗来讲,截断

奇异值分解就是在低维空间中寻找最接近原矩阵

的低维矩阵


奇异值分解定义为



其中,矩阵


中列向量


为左奇异向量;矩阵


为奇异值矩阵,是对角阵,


为第


个奇异值;矩阵


中列向量


为右奇异向量。于是矩阵


可以展开成



重点来了,截断奇异值分解就是通过保留(3)式中前


项,即截留前

个奇异值,在

维空间中寻找最接近原矩阵

的低维矩阵

,即



SVD(奇异值分解)一个重要的应用就是图像压缩存储,因为数字图像本身就是个矩阵,通过一个近似的低秩矩阵替代原矩阵,可以大大减少存储量,如下例子所示:


svf程序分析 sv define_矩阵的奇异值分解_04

原图374×377

于是,原图可以用低秩矩阵替代:


svf程序分析 sv define_奇异值分解_05

k=10

可以看到,只需保留10个秩,图像大致轮廓基本呈现,那增加截留的秩数,则


svf程序分析 sv define_矩阵为奇异工作精度_06

k=50

可以看到,截留50个秩原图基本复现,那继续增大秩数,则


svf程序分析 sv define_矩阵为奇异工作精度_07

k=80

此时,


,跟原图已经几乎没有差别,但是存储消耗只有原图的一半。


当然,图像压缩存储并不是直接由于近似替代矩阵


是低秩的。因为矩阵


跟原矩阵


大小是相同的,直接存储


并没有节省存储。但是低秩矩阵


只需要少量



,所以实际上是通过存储少量



来替代原矩阵


来节省存储。


SVD压缩存储数字图像MATLAB代码:


grayValue = imread('image.png');
grayValue = im2double(grayValue);
[m, n]= size(grayValue);
%%
% 奇异值分解
nr = 80; %保留的秩数
[u, s, v] = svd(grayValue);
grayValue2 = u(:,1:nr)*s(1:nr,1:nr)*v(:,1:nr)';
grayValue2 = grayValue2*255;
grayValue2 = uint8(grayValue2);
figure
subplot(1,2,1)
imshow(grayValue)
title('原图')
subplot(1,2,2)
imshow(grayValue2)
title(['秩r=',num2str(nr)])
imwrite(grayValue2,'image2.png')


事实上,SVD(奇异值分解)还有很多用途,比如机器学习中的主成分分析,这才是直接利用低维矩阵


替代原矩阵


实现降维。