奇异值分解(SVD)

Posted pracneyman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了奇异值分解(SVD)相关的知识,希望对你有一定的参考价值。

  首先说明一下特征值:设A是n阶方阵,如果存在 λ 和n维非零向量X,使 技术分享图片AX = λX ,则 λ 称为方阵A的一个特征值,X为方阵A对应于或属于特征值 λ 的一个特征向量。

  AX = λX 的过程是一个从矩阵乘法到数乘操作的过程。数乘的实质是对向量X进行缩放,缩放因子为λ ,缩放只改变大小,不改变方向。找到特征值和特征向量的过程称为特征值分解,可以利用解线性方程组(λE-A)X=0 来完成。对应于不同特征值的特征向量线性无关,如果原矩阵A是对称矩阵,对应于不同特征值的特征向量必定正交 。

  如果得到了N阶对称矩阵A的N个特征值,且N个特征值均不同,那么特征向量必定正交,就可以经过标准化后(是否需要,如何做?存疑?直接除以长度么?),作为A的标准正交基。将A向N个基上投影,投影长度=特征值绝对值,特征值越大,表示了矩阵在对应的特征向量上的方差越大,功率越大,信息量越多。因此,特征值分解得到了特征值和特征向量,特征值的大小表示了对应的特征有多重要,特征向量的方向表示了特征的属性。

  既然特征值越大的方向上包含了越多的信息,就可以在特征值分解后,只保留特征值较大的方向对应的数据,删除小特征值对应方向的数据,保证了数据量减少,而有用信息基本不变,这就是PCA的思想。

  (有一个疑问:只有对称阵的特征值不同才能保证特征向量彼此正交,如果特征值相同,线性无关无法保证,如何找正交基呢?)

  注意:特征值分解要求A是方阵,如果A不是方阵,而是一个1920x1080的灰度图构成的矩阵,无法找特征值,此时可以找奇异值。

  

  奇异值:矩阵A的大小为mxn,奇异值分解将矩阵分解成若干个秩一矩阵之和,即

技术分享图片

每个技术分享图片都是奇异值,按照从大到小的顺序排列,u和v分别表示列向量,uv‘ 是秩为1的矩阵,( 可以利用 R(A)+R(B)-n <= R(AB) <= min{R(A),R(B)} 得到R(uv‘)=1)。只保留较大的奇异值对应的数据,同样可以达到降维的效果。下面是对一张图片进行的实验。

技术分享图片

 

Matlab代码如下:

 1 clear,clc;
 2 close all;
 3 
 4 imgorigin = imread(saoirse.jpg);
 5 imgray = double(rgb2gray(imgorigin));
 6 subplot(331);imshow(imgray,[]);title(original-gray);
 7 [m,n] = size(imgray);
 8 [U,S,V] = svd(imgray);
 9 %返回与imgray同大小的对角矩阵S,两个矩阵U和V,且满足imgray=U*S*V10 %若imgray大小为m×n,则U为m×m矩阵,V为n×n矩阵.S为m×n矩阵,奇异值在S的对角线上
11 
12 decomp = U(:,:)*S(:,1)*V(:,1);
13 subplot(332);imshow(decomp,[]);title(svd-前1个特征);
14 
15 decomp = U(:,:)*S(:,1:5)*V(:,1:5);
16 subplot(333);imshow(decomp,[]);title(svd-前5个特征);
17 
18 decomp = U(:,:)*S(:,1:10)*V(:,1:10);
19 subplot(334);imshow(decomp,[]);title(svd-前10个特征);
20 
21 decomp = U(:,:)*S(:,1:50)*V(:,1:50);
22 subplot(335);imshow(decomp,[]);title(svd-前50个特征);
23 
24 decomp = U(:,:)*S(:,1:80)*V(:,1:80);
25 subplot(336);imshow(decomp,[]);title(svd-前80个特征)
26 
27 decomp = U(:,:)*S(:,1:150)*V(:,1:150);
28 subplot(337);imshow(decomp,[]);title(svd-前150个特征);
29 
30 decomp = U(:,:)*S(:,1:220)*V(:,1:220);
31 subplot(338);imshow(decomp,[]);title(svd-前220个特征);
32 
33 decomp = U(:,:)*S(:,1:282)*V(:,1:282);
34 subplot(339);imshow(decomp,[]);title(svd-前282个特征);

 

参考:

1. https://blog.csdn.net/index20001/article/details/73501632

2. https://www.zhihu.com/question/22237507

3. 线性代数与空间解析几何-郑宝东


以上是关于奇异值分解(SVD)的主要内容,如果未能解决你的问题,请参考以下文章

奇异值分解SVD

奇异值分解 (SVD) 输出一维奇异值数组,而不是二维对角矩阵 [Python]

奇异值分解(SVD)

什么是奇异值?奇异值分解是什么?SVD分解详解及实战

奇异值分解的意义

SVD(奇异值矩阵分解) 转载