奇异值分解SVD用于数据压缩(matlab实现)

奇异值分解SVD的目的:

对于一个n阶方阵A,可以求出其特征值和特征向量,满足Ax=λx,可以对其进行特征值分解,由A=WΣWT,W由n个特征向量构成,Σ是对角矩阵,对角线上的元素为特征值

对于一般的mxn维矩阵A,无法求其特征值和特征向量,但是可以求得其奇异值,完成奇异值分解,即A=UΣVT,Σ是包含r个奇异值的对角矩阵,奇异值分解可以看作是特征值分解的推广

奇异值分解SVD用于数据压缩(matlab实现)_第1张图片

奇异值分解SVD的计算步骤:

  1. 求AAT的特征值和特征向量,将特征向量单位化、正交化构成U
  2. 求ATA的特征值和特征向量,将特征向量单位化、正交化构成V
  3. 将AAT(或ATA)的非零特征值开方得到奇异值,构成Σ

奇异值分解SVD的应用:

奇异值和特征值的性质类似,将原始数据向大的奇异值对应的特征向量的方向投影,可以在降低数据维度的同时保留主要的信息,下图中,原始数据在z1方向上的投影可以更多的体现出它的数据特征(在一个方向上数据的方差越大,所代表的信息越多,如果在一个方向上没有方差,那么从这个方向来描述数据,所有的数据都是一致的,携带的信息量为0)。对于一般的mxn维矩阵A要对其进行降维,只能采用SVD方法实现PCA算法。

奇异值分解SVD用于数据压缩(matlab实现)_第2张图片

值得注意的是,使用SVD方法实现PCA算法只能对数据矩阵X从一个方向上降维,也就是要么从行方向,要么从列方向上进行降维压缩,在实际数据中,行和列所代表的意义不同,比如n个具有m个时间点的信号构成mxn维的矩阵,那么压缩的选择就是很关键的。

SVD压缩图像matlab实现:

function mySVD
 
data = im2double(imread('data.jpg'));       %读取图片
data = data(:,:,1);
data = ((data-min(min(data)))/(max(max(data))-min(min(data))))*250;     %将灰度值调整到0-250
imshow(uint8(rot90(data,1)));       %显示原始图像
title('原始图像');
 
[U,S,V] = svd(data);        %对图像进行SVD分解
 
%保留不同个数的奇异值
S_10 = S;   
S_10(11:end,:) = 0;     %将从第11大开始的奇异值置0
 
S_50 = S;
S_50(51:end,:) = 0;     %将从第51大开始的奇异值置0
 
S_100 = S;
S_100(101:end,:) = 0;       %将从第101大开始的奇异值置0
 
data_10 = U*S_10*V';
imshow(uint8(rot90(data_10,1)));       %显示保留最大的10个奇异值的图像
title('由前10大的奇异值重建的图像');
 
data_50 = U*S_50*V';
imshow(uint8(rot90(data_50,1)));        %显示保留最大的50个奇异值的图像
title('由前50大的奇异值重建的图像');
 
data_100 = U*S_100*V';
imshow(uint8(rot90(data_100,1)));        %显示保留最大的100个奇异值的图像
title('由前100大的奇异值重建的图像');
 
end

奇异值分解SVD用于数据压缩(matlab实现)_第3张图片奇异值分解SVD用于数据压缩(matlab实现)_第4张图片奇异值分解SVD用于数据压缩(matlab实现)_第5张图片奇异值分解SVD用于数据压缩(matlab实现)_第6张图片

随着保留的奇异值的数量增多,图像重建的效果越来越好,由前100大的奇异值重建出的图像基本上与原图一致

  

你可能感兴趣的:(matlab实现,矩阵基础知识,matlab,算法,学习)