matlab实现 特征值分解用于数据压缩

特征值与特征向量的定义:
Ax=λx
特征值与特征向量的理解1——简化运算:
A作用于特征向量x的效果只是起到了λ倍的缩放效果,Ax将矩阵运算简化成了代数运算λx,也就是说特征值代表了缩放倍数,特征向量代表了方向
特征值与特征向量的理解2——线性变换:
将A看作线性变换(线性变换包含平移、旋转、缩放),Ab=c代表向量b在A的作用(线性变换)下转换为向量c,具体来说是将b在A的各个特征向量xi的方向上进行了对应的特征值λi倍数的缩放

matlab实现  特征值分解用于数据压缩

文章插图
b在A的作用下,向特征值大的方向拉伸的倍数更大,拉伸后,在x轴=(1,0)方向上的投影远远大于y轴=(0,1)方向上的投影,认为此时x轴方向上反映了向量c更多的信息
推广到n维矩阵A,那么就是向着A的n个特征向量方向进行拉伸
特征值与特征向量的应用:
由于拉伸的倍数受到特征值大小的调控,那么在进行数据压缩的时候,只保留特征值大的方向上的投影(如上例中只保留x轴方向上的投影,舍去y轴方向上的投影),这样就在损失小部分信息的情况下,完成了数据的压缩
使用特征值分解用于图像压缩:
对于nxn的方阵,可以使用特征值分解对其进行数据压缩,通过保留前k大的特征值实现
function myeigsdata = http://www.kingceram.com/post/im2double(imread('data.jpg'));%读取图片data = ((data-min(min(data)))/(max(max(data))-min(min(data))))*250;%将灰度值调整到0-250imshow(uint8(data));%显示原始图像title('原始图像');[V,D] = eig(data);%求矩阵的特征值和特征向量%保留不同个数的奇异值D_50 = D;D_50(51:end,:) = 0;%将从第51大的特征值置0D_100 = D;D_100(101:end,:) = 0;%将从第101大的特征值置0D_200 = D;D_200(201:end,:) = 0;%将从第201大的特征值置0data_50 = V*D_50*V^(-1);imshow(uint8(data_50));%显示保留最大的50个特征值的图像title('由前50大的特征值重建的图像');data_100 = V*D_100*V^(-1);imshow(uint8(data_100));%显示保留最大的100个特征值的图像title('由前100大的特征值重建的图像');data_200 = V*D_200*V^(-1);imshow(uint8(data_200));%显示保留最大的200个特征值的图像title('由前200大的特征值重建的图像');end
【matlab实现特征值分解用于数据压缩】随着保留的特征值的增加,图像保留的信息增多,重建的质量越来越好