SVD降维(相当好理解的文章)

作者:belupreda
链接:https://www.zhihu.com/question/34143886/answer/196294308
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

看待一个矩阵,可以从多方面看。SVD则是从列向量如何生成的角度来看。假设一个矩阵的列向量有100列,但只由少数几个‘基’(比如10个吧)组合而成的,那么如何求出这10个基?如果有了这些‘基’,如何把这些基再组合起来生成这个矩阵?仔细想这句话,想明白就不用再看下面了。为了帮助理解 ,给个简单例子,比如以下矩阵(12行10列):m=

[1,1,1,1,1,1,1,1,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,0,0,1,1,0,0,1,1;
1,1,0,0,1,1,0,0,1,1;
1,1,0,0,1,1,0,0,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1;]

很明显,其实这里面只有三个不同的列(12行3列):

U=[
1,1,1;
1,0,0;
1,0,0;
1,0,1;
1,0,1;
1,0,1;
1,0,0;
1,0,0;
1,1,1;
1,1,1;
1,1,1;
1,1,1;]

那么要从U生成M,只需要下面这个矩阵(3行10列):

V=[1,1,0,0,0,0,0,0,1,1;
0,0,1,1,0,0,1,1,0,0;
0,0,0,0,1,1,0,0,0,0;]

要还原M,只需要UV。而M是120个元素,U是3列,36个元素,V是3行,30个元素。通过这个例子,我们看到了降维,10列变成3列。。。,还看到了压缩。现在,问题来了,既然这样就能得到分解,我们何苦用SVD?答案很简单:大多数矩阵不是靠人眼就能分辨出基,通常情况下,每一列都是不同的基组合而成。所以借用SVD算法来找到基。另外,每个基在生成列的时候,权重也不一样。经常出现某几个基权重特别大,而另外几个基特别小。在SVD分解的时候,就可以得到这个值。如果看到这里明白了,接下去可以不看。接下来讲SVD是怎么达到我们的目标的:再考虑下:什么是良好的基?答案:一组良好的基应该是归一化正交的,因为正交之后不会出现冗余的信息。所以,M应当分解成:一组正交的列基权重(特征值组成的对角矩阵)*一组正交的行向量。写成公式就是:U就是列基,S就是权重,V则表示如何把U的列组合成M中的列。U,S,V是怎么求出来的?
这个是一个很巧妙的技巧了,想出来的家伙是大神。先讲下预备知识 :1.实系数矩阵与自己的转置相乘后是实对称矩阵,而且实对称矩阵必定可以分解出特征值与特征向量。2.如果矩阵是单位正交矩阵,那么转置是本身的逆矩阵。也就是A’A=AA’=I。接着看SVD,由于U是单位正交矩阵,S是对角矩阵,所以把M转置再乘M,也就是 注意下, 还是对角矩阵,所以求V,就是求M’M的特征值与特征向量。同理里,求U 就是求MM’的特征值与特征向量。嗯。。。特征值与特征向量的内容,我就不解释了。自己看下书。SVD使用最后讲下matlab中svd 函数的使用,以前面的矩阵为例,先SVD分解 ,得到

U,S,V>>
[U,S,V]=svd(M) 
U =-0.3621    0.2531   -0.0696    0.8873    0.0684    0.0900    0.0000   -0.0000   -0.0000         0         0    0.0000-0.1877   -0.3516   -0.3019   -0.0900    0.0349    0.8606    0.0000   -0.0000   -0.0000         0    0.0000    0.0000-0.1877   -0.3516   -0.3019    0.0888   -0.8251   -0.2477   -0.0000    0.0000    0.0000         0   -0.0000    0.0000-0.2604   -0.2486    0.4513   -0.0000   -0.0000    0.0000    0.7561    0.3082   -0.0000         0    0.0000    0.0000-0.2604   -0.2486    0.4513    0.0000   -0.0000   -0.0000   -0.1111   -0.8089    0.0000   -0.0000   -0.0000   -0.0000-0.2604   -0.2486    0.4513    0.0000    0.0000   -0.0000   -0.6450    0.5007   -0.0000    0.0000    0.0000    0.0000-0.1877   -0.3516   -0.3019    0.0006    0.3951   -0.3065    0.0000   -0.0000    0.7071   -0.0000   -0.0000   -0.0000-0.1877   -0.3516   -0.3019    0.0006    0.3951   -0.3065   -0.0000    0.0000   -0.7071    0.0000    0.0000    0.0000-0.3621    0.2531   -0.0696   -0.2218   -0.0171   -0.0225   -0.0000   -0.0000   -0.0000    0.8660   -0.0000   -0.0000-0.3621    0.2531   -0.0696   -0.2218   -0.0171   -0.0225   -0.0000   -0.0000   -0.0000   -0.2887   -0.5774   -0.5774-0.3621    0.2531   -0.0696   -0.2218   -0.0171   -0.0225   -0.0000   -0.0000   -0.0000   -0.2887    0.7887   -0.2113-0.3621    0.2531   -0.0696   -0.2218   -0.0171   -0.0225   -0.0000   -0.0000   -0.0000   -0.2887   -0.2113    0.7887S =8.4404         0         0         0         0         0         0         0         0         0   0    3.1763         0         0         0         0         0         0         0         0   0         0    1.6344         0         0         0         0         0         0         0   0         0         0    0.0000         0         0         0         0         0         0   0         0         0         0    0.0000         0         0         0         0         0   0         0         0         0         0    0.0000         0         0         0         0   0         0         0         0         0         0    0.0000         0         0         0   0         0         0         0         0         0         0    0.0000         0         0   0         0         0         0         0         0         0         0    0.0000         0   0         0         0         0         0         0         0         0         0    0.0000   0         0         0         0         0         0         0         0         0         0   0         0         0         0         0         0         0         0         0         0V =-0.3960   -0.2792   -0.1234   -0.8645   -0.0503   -0.0083   -0.0000   -0.0000         0         0-0.3960   -0.2792   -0.1234    0.2961   -0.2482    0.7751   -0.0000   -0.0000    0.0000   -0.0000-0.2145    0.3983   -0.2128    0.0503   -0.8176   -0.2810    0.0000    0.0000    0.0000    0.0000-0.2145    0.3983   -0.2128   -0.0168    0.2725    0.0937   -0.4323   -0.6926    0.0000    0.0000-0.3071    0.1636    0.6156    0.0000   -0.0000    0.0000   -0.5998    0.3744   -0.0000    0.0000-0.3071    0.1636    0.6156    0.0000   -0.0000    0.0000    0.5998   -0.3744    0.0000   -0.0000-0.2145    0.3983   -0.2128   -0.0168    0.2725    0.0937    0.2162    0.3463    0.7071   -0.0000-0.2145    0.3983   -0.2128   -0.0168    0.2725    0.0937    0.2162    0.3463   -0.7071    0.0000-0.3960   -0.2792   -0.1234    0.2842    0.1492   -0.3834    0.0000    0.0000   -0.0000    0.7071-0.3960   -0.2792   -0.1234    0.2842    0.1492   -0.3834    0.0000    0.0000   -0.0000   -0.7071>>

观察下U,S,V。其中S中只有三个特征值不为0,表明U中只有三个列向量是有效,那么,要还原M,我们不需要U,S,V的全部。只需要各取三列就行:
U(:,1:3)*S(1:3,1:3)*V(:,1:3)’
ans =1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.00001.0000 1.0000 -0.0000 -0.0000 0.0000 0.0000 -0.0000 -0.0000 1.0000 1.00001.0000 1.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 1.0000 1.00001.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.00001.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.00001.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.00001.0000 1.0000 -0.0000 -0.0000 0.0000 0.0000 -0.0000 -0.0000 1.0000 1.00001.0000 1.0000 -0.0000 -0.0000 0.0000 0.0000 -0.0000 -0.0000 1.0000 1.00001.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.00001.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.00001.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.00001.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000>>
总结下:要做一个降维的算法 ,很简单,只要SVD一下,计算下S的特征值 ,哪些特征值比较大,哪些比较小。大的保留,小的丢弃。然后就取相应数量的U列与V列。得到简化的U1,S1,V1。就是降维了。

你可能感兴趣的:(数学基础)