SVD分解及其应用

来源:互联网 发布:linux增加局域网ip段 编辑:程序博客网 时间:2024/05/19 01:33
 

SVD分解及其应用

标签: 矩阵图像压缩
 356人阅读 评论(0) 收藏 举报

目录(?)[+]

  • SVD起源
    • 对角化概述
  • SVD
  • SVD应用
    • 图像压缩2
    • 数据去噪
    • LSA
    • 推荐系统
  • 注意
  • 参考资料

这里写图片描述

SVD可谓线性代数的登峰造极者。 
其本质就是找到将任何一个矩阵对角化分解的两组标准正交的基底,同时对应的奇异值反映了对应基底变换的性质,为0表示对应的维度缺少信息,越大表明对应的维度容纳的信息方差越大。

SVD起源

认识一个问题总要追根究底,为什么要有SVD这个东西呢? 
要了解这一点,必须知道矩阵对角化是个奇妙的东西,以及并不是所有的矩阵都可以对角化。同时引出了今天的重点——如何让每个矩阵都可以对角化?


对角化概述

矩阵分析中,我们都想要好的矩阵,好的矩阵的一大特点就是可以对角化。

对角化的对象矩阵有两类:

  1. 方矩阵的对角化
  2. 长方形矩阵的对角化

对角化的方法也有两类:

  1. 输入和输出空间的基完全一样,对应的特征值特征向量分解A=SΛS1。但是这种情况下S基中的向量不一定是正交的。当A是对称矩阵的话S中的基可以是标准正交的。同时基也不是一定存在的,只有有足够的特征向量,比如n×n的矩阵对角化的充要条件是有n个不相关的特征向量。
  2. 输入空间和输出空间的基不一样,这就对应了SVD,也就是AV=USV,U分别是输入和输出空间的基,这种情况下的对角化总是存在的。

所以,综合对角化对象矩阵的形状以及对角化的方法,有以下结论:

  1. 如果矩阵是n阶方阵,可以尝试同一组基下面的对角化,也就是特征值特征向量分解。这种情况下对角化存在当且仅当存在n个线性无关的特征向量。如果不存在的话说明不能找到同一组基使矩阵对角化。同时如果矩阵是对称矩阵的话,那么特征值肯定存在,肯定存在标准正交的特征向量。
  2. 其他矩阵可以采用不同的两组基底实现SVD对角化。
  3. 对于n阶方阵来说,eig分解与svd分解相等当且仅当矩阵是半正定矩阵,也就是方阵在同一组标准正交基上对角化并且特定维度上的方向不变。
  4. 特征值和奇异值分别表示对角化解耦后对应的基底的长度,从线性变换的角度上是对不同的基的延伸程度,从方差的角度上来说是方差的大小信息的多少。
  5. 特征值或奇异值如果等于0,说明矩阵存在某一个维度上的信息缺失。因此可以得到如果矩阵Amn的秩为r,那么它肯定有r个不等于0的特征值和奇异值。

对角化的优点是(以特征值分解举例):

  1. 可以进行对角化分解,A=SΛS1
  2. 矩阵的k次方Ak=SΛkS1
  3. 从对角化的矩阵中可以知道矩阵是不是缺失了某些维度的信息(特征值或者奇异值等于0),如果存在0的话那么矩阵不可逆(因为损失信息回不到以前了)。
  4. 如果基底是标准正交基,那么从特征值或者奇异值的绝对值上可以找到哪个维度上的方差最大,利用这个思路可以实现数据压缩。

那么,具体如何将一个矩阵分解成对角矩阵和标准正交矩阵的乘积?

SVD

## 公式描述
AmnAmnAmn=UmrSrrVnrT=UmmSmnVnnT=u1σ1v1T+u1σ2v2T++urσ1vrT
上面的分解计算了奇异值σ不为0的情况,中间的分解考虑了奇异值σ为0的情况,最后的分解拆成了r个列向量与行向量的乘积。 其中,
UVeigenValue(U)i=eigenVector(AAT)=eigenVector(ATA)=eigenValue(V)i=(diag(Sr)i)2ir
## 几何描述
图片名称

SVD的几何意义是对于特定的矩阵Amn,寻找行空间Rn中的一组标准正交基,通过线性变换A得到列空间Rm中的一组标准正交基。σi也可以理解成变换到AV空间后的模Avi=σiui

同时,如果矩阵的秩为r,那么行空间、零空间、列空间、左零空间的示意与转换如上图所示。

采用matlab中的eigshow函数,可以得到类似的解释:

图片名称图片名称

通过选择一组合适的正交基V,使得AV=US也是正交的。然后分别以这两组正交且单位化的V,U为基,S中包含了他们的比例系数,构建了对角化的矩阵S,实现了对角化解耦的线性变换。

SVD应用

##图像压缩 我们的目标就是这位美女——蒋勤勤,将对这幅图片实现压缩。
图片名称

首先,先来看看原来的RGB图片以及RGB分量的灰度图片:

图片名称

SVD之后,先来看看SVD的奇异值大小的分布情况和累计分布比率:

图片名称图片名称

接着,看一看选择不同数量的奇异值的结果。

这里写图片描述

最后,看一看图像的压缩比,原图像是686×482,选择最大的100个奇异值已经能够得到相当好的结果了。这时候奇异值的累积比例为89.6%,压缩比是 

686×482(686+482)×100=2.83

具体代码如下:

<code class="language-matlab hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 读入图像RGB数据,并从Uint8转换成double类型方便之后的处理。</span>p = imread(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/Users/yangguangyao/Desktop/test/p.jpg'</span>);pr = p(:,:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);pg = p(:,:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);pb = p(:,:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>);pr = double(pr);pg = double(pg);pb = double(pb);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 可视化图像</span>figure()subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);imshow(p)title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'原来的RGB图像'</span>)subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);imshow(mat2gray(pr))title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'R分量的灰度图像'</span>)subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>);imshow(mat2gray(pg))title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'G分量的灰度图像'</span>)subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>);imshow(mat2gray(pb))title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'B分量的灰度图像'</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% SVD分解</span><span class="hljs-matrix" style="box-sizing: border-box;">[Ur,Sr,Vr]</span> = svd(pr);<span class="hljs-matrix" style="box-sizing: border-box;">[Ug,Sg,Vg]</span> = svd(pg);<span class="hljs-matrix" style="box-sizing: border-box;">[Ub,Sb,Vb]</span> = svd(pb);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 分析SVD,计划选取1 3 5 10 30 50 100 150</span>svdD = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">diag</span>(Sr);cumsumD = cumsum(svdD);plot(svdD,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'LineWidth'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)plot(cumsumD,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'LineWidth'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 分解后按照singular value从大到小选择</span>fr = @(n) Ur(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n)*Sr(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n)*Vr(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n)<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">';fg = @(n) Ug(:,1:n)*Sg(1:n,1:n)*Vg(:,1:n)'</span>;fb = @(n) Ub(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n)*Sb(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n)*Vb(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:n)<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">';param = [1,3,5,10,30,50,100,150];figure()for i = 1:8    subplot(2,4,i);    n = param(i);    pnew(:,:,1) = fr(n);    pnew(:,:,2) = fg(n);    pnew(:,:,3) = fb(n);    pnew = uint8(pnew);    imshow(pnew)    title(strcat(num2str(param(i)),'</span>个奇异值<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'))end</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li></ul>

图像压缩2

这里写图片描述

上图是一个15×25的图像,其本质上是15×25的矩阵,白色的元素代表相应位置上是1,黑色代表相应位置上是0。其一共有三种模式:

这里写图片描述

这个矩阵的特征值有3,对应了三种的模式,选择最大的三个奇异值进行SVD后的结果是:

这里写图片描述

代码如下:

<code class="language-matlab hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 构建目标图像矩阵X</span>x1 = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">ones</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">25</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);x2 = <span class="hljs-matrix" style="box-sizing: border-box;">[ones(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);zeros(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">15</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);ones(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);]</span>;x3 = <span class="hljs-matrix" style="box-sizing: border-box;">[ones(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);zeros(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);ones(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);zeros(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);ones(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);]</span>;X = <span class="hljs-matrix" style="box-sizing: border-box;">[repmat(x1,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>),repmat(x2,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>),repmat(x3,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>),repmat(x2,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>),repmat(x1,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)]</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 查看矩阵的秩</span>r = rank(X);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 进行SVD</span><span class="hljs-matrix" style="box-sizing: border-box;">[U,S,V]</span> = svd(X);Xnew = U(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:r)*S(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:r,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:r)*V(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:r)<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">';% 分析画图figure()subplot(1,2,1)imshow(X)title('</span>原始的图像<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">')subplot(1,2,2)imshow(Xnew)title('</span>选择秩数量<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>的奇异值分解<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">')</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li></ul>

数据去噪

SVD总能找到标准化正交基后方差最大的维度,因此可以用它进行降维去噪等等。

下面分别用SVDlinear regression去拟合直线,结果如下,看来效果还不错哦。 
这里写图片描述

代码如下:

<code class="language-matlab hljs  has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 模拟线性数据,加上一定的高斯噪声</span>X = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>;Xb = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">ones</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);Y = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>*X + random(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Normal'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 进行SVD分解并选择原输入空间的一个奇异值比较大的基,实现了数据降维</span>M = <span class="hljs-matrix" style="box-sizing: border-box;">[X;Y]</span>;<span class="hljs-matrix" style="box-sizing: border-box;">[U,S,V]</span> = svd(M);U1 = U(:,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);u1 = U1(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);u2 = U1(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);k = (u2/u1);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 进行线性回归</span>w = pinv(<span class="hljs-matrix" style="box-sizing: border-box;">[X;Xb]</span>)<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'*Y'</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 分别是SVD和线性回归拟合的数据</span>Y1 = k*X;Y2 = w(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)*X+w(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 画图并比较</span>figure()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% 注释蛮方便的函数ezplot('y-2*x-1')</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">% refline(u2/u1,0) </span>hold onplot(X,Y,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'ko'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'LineWidth'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)plot(X,Y1,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'r-'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'LineWidth'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)plot(X,Y2,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b-'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'LineWidth'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)legend(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'数据点'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'SVD拟合'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'线性回归拟合'</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li></ul>

LSA

LSA(Latent Semantic Analysis也叫作Latent Semantic Indexing)分析文档发现潜在的概念意义。

推荐系统

注意

  1. USVT分解和SΛS1分解等价当且仅当矩阵是半正定(对称矩阵,有大于等于0的特征值)。
  2. 介绍下几种矩阵分解

    • A=USVTU,V都是标准正交的,S是对角化的上面按照由大到小的顺序存放着奇异值。
    • A=QHRQ是标准正交的,R对角线上是1,H是对角化的上面存放着高度hi
    • A=LDUL,U的对角线上是1,主元存放在D中。

A的行列式的绝对值等于奇异值的乘积,等于主元乘积的绝对值,等于高度hi乘积的绝对值,等于特征值的乘积。

参考资料

  1. 关于SVD很棒的包含几何解释的资料
  2. 关于LSA的很棒的文章
0 0
原创粉丝点击