奇异值分解就是在低维空间中寻找最接近原矩阵
的低维矩阵
,说白了就是数据降维。
奇异值分解是一种十分重要但又难以理解的矩阵处理技术,据人工智能的大牛吴恩达老师所说,在机器学习中是最重要的分解没有之一的存在。那么,奇异值分解到底是在干什么呢?
矩阵
表示的是高维数据,通常情况下高维数据分布并不是雨露均沾的,而往往是厚此薄彼,集中分布在某些维度上,如下图
虽然原始数据的的确确是二维数据,但是其实主要集中分布在直线
(一维空间)附近,在这里,SVD(奇异值分解)其实就是在寻找直线
,然后将数据映射到直线
上,实现数据降维的过程,即如下图
于是,通过SVD(奇异值分解),就可以利用降维后的数据近似地替代原始数据。所以,SVD(奇异值分解)其实就是在寻找数据分布的主要维度,将原始的高维数据映射到低维子空间中实现数据降维。
数学上来说,若一
矩阵
,其秩为
,通过奇异值分解可求一个低秩矩阵
(
),在弗罗贝尼乌斯范数意义下最接近原矩阵
。弗罗贝尼乌斯范数定义如下:
显然,两个矩阵各个元素越接近,弗罗贝尼乌斯范数就越接近,而矩阵的秩
表示矩阵的维度,所以通俗来讲,截断
奇异值分解就是在低维空间中寻找最接近原矩阵
的低维矩阵
。
奇异值分解定义为
其中,矩阵
中列向量
为左奇异向量;矩阵
为奇异值矩阵,是对角阵,
为第
个奇异值;矩阵
中列向量
为右奇异向量。于是矩阵
可以展开成
重点来了,截断奇异值分解就是通过保留(3)式中前
项,即截留前
个奇异值,在
维空间中寻找最接近原矩阵
的低维矩阵
,即
SVD(奇异值分解)一个重要的应用就是图像压缩存储,因为数字图像本身就是个矩阵,通过一个近似的低秩矩阵替代原矩阵,可以大大减少存储量,如下例子所示:
原图374×377
于是,原图可以用低秩矩阵替代:
k=10
可以看到,只需保留10个秩,图像大致轮廓基本呈现,那增加截留的秩数,则
k=50
可以看到,截留50个秩原图基本复现,那继续增大秩数,则
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(奇异值分解)还有很多用途,比如机器学习中的主成分分析,这才是直接利用低维矩阵
替代原矩阵
实现降维。