SVD分解的应用探究

  • 一、特征值分解(EVD)
    • 1.特征值
    • 2.特征值分解过程
  • 二、奇异值分解(SVD)
    • 1.奇异值分解的形式
    • 2.奇异值分解的方法
    • 3.奇异值分解的价值
  • 三、SVD分解在图像处理中的应用
    • 3.1图像处理分析
    • 3.2SVD分解python代码
    • 3.3输出结果
  • 四、用Eigen库实现SVD分解
  • 五、SVD分解的优点

  奇异值分解(Singular Value Decomposition,简称SVD)是在机器学习领域广泛应用的算法,它可以用于降维算法中的特征分解,使用SVD对矩阵进行分解, 能得到代表矩阵最明显变化的矩阵元素,是很多机器学习算法的基石。本文就对SVD的原理进行总结归纳,并举例说明其在图像处理中的应用。

一、特征值分解(EVD)

  在介绍SVD分解之前,要先了解一下特征值分解,即EVD分解。关于特征值和特征向量的含义及理解,可以参考这篇文章。

1.特征值

  如果说一个向量vvv是方阵An×nA_{n \times n}An×n​的特征向量,将一定可以表示成下面的形式:
Av=λvAv=\lambda vAv=λv
写成矩阵的形式为:
AP=[λ1λ2⋱λn]PAP= \begin{bmatrix} \lambda _1 \\ & \lambda _2 \\ & & \ddots \\ & & & \lambda _n \\ \end{bmatrix} P AP=⎣⎢⎢⎡​λ1​​λ2​​⋱​λn​​⎦⎥⎥⎤​P

其中,Pn×nP_{n\times n}Pn×n​为特征向量vin×1{v_i}_{n\times 1}vi​n×1​组成的矩阵:
P=[v1v2⋯vn]P=\begin{bmatrix} v_1 &v_2 & \cdots &v_n \end{bmatrix} P=[v1​​v2​​⋯​vn​​]

2.特征值分解过程

  如果矩阵AAA是一个m×mm\times mm×m的实对称矩阵(即A=ATA=A^TA=AT ),那么它可以被分解成如下的形式:
A=QΣQT=Q[λ1λ2⋱λm]QTA=Q\Sigma Q^T=Q \begin{bmatrix} \lambda _1 \\ & \lambda _2 \\ & & \ddots \\ & & & \lambda _m \\ \end{bmatrix} Q^T A=QΣQT=Q⎣⎢⎢⎡​λ1​​λ2​​⋱​λm​​⎦⎥⎥⎤​QT
其中Qm×mQ_{m\times m}Qm×m​为标准正交阵,即有QQT=I,QTQ=IQQ^T=I,Q^TQ=IQQT=I,QTQ=I,Σ\SigmaΣ为对角矩阵,维度为m×mm\times mm×m。λi\lambda _iλi​为特征值。

二、奇异值分解(SVD)

1.奇异值分解的形式

  特征值分解(EVD)是一个提取方阵特征很的方法,但是它只适用于方阵。而在机器学习的数据中,绝大部分的数据组成的矩阵都不是方阵,如一组数据有mmm个样本,每个样本有 nnn个特征,往往这样的数据是样本的mmm数量非常大,特征的nnn数量有限,这样的数据组成的 矩阵m×nm\times nm×n是无法进行特征值分解的。奇异值分解就是用来分解这种任意矩阵的分解方法。
  奇异值分解是将一个非零的实数矩阵Am×nA_{m \times n}Am×n​分解成由三个是矩阵乘积形式的运算,即进行矩阵的因子分解:
A=UΣVTA=U\Sigma V^TA=UΣVT
其中,UUU为m×mm\times mm×m的单位正交阵,VVV为n×nn\times nn×n的单位正交阵,即有UUT=I,VVT=IUU^T=I,VV^T=IUUT=I,VVT=I。Σ\SigmaΣ是m×nm\times nm×n维的对角矩阵其对角线上的数值即为奇异值,并且按照降序排列,如:
Σ=[σ1σ2⋱⋱]m×n\Sigma= \begin{bmatrix} \sqrt{ \sigma _1} \\ & \sqrt{\sigma _2} \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{m\times n} Σ=⎣⎢⎢⎡​σ1​​​σ2​​​⋱​⋱​⎦⎥⎥⎤​m×n​
  UΣVTU\Sigma V^TUΣVT为矩阵AAA的奇异值分解,σi\sqrt{\sigma _i}σi​​为矩阵的奇异值,UUU称为左奇异矩阵,VVV称为右奇异矩阵。各矩阵的维度分别为U∈Rm×mU\in R^{m\times m}U∈Rm×m,Σ∈Rm×n\Sigma \in R^{m\times n}Σ∈Rm×n,V∈Rn×nV\in R^{n\times n}V∈Rn×n。

2.奇异值分解的方法

  为求解上述UUU,Σ\SigmaΣ,VVV,我们可以利用如下性质:
AAT=UΣVT(UΣVT)T=UΣVTVΣTUT=UΣΣTUTATA=(UΣVT)TUΣVT=VΣTUTUΣVT=VΣTΣVTAA^T=U\Sigma V^T(U\Sigma V^T)^T=U\Sigma V^TV\Sigma ^TU^T=U\Sigma \Sigma^TU^T\\ A^TA=(U\Sigma V^T)^TU\Sigma V^T=V\Sigma ^TU^TU\Sigma V^T=V\Sigma ^T\Sigma V^T AAT=UΣVT(UΣVT)T=UΣVTVΣTUT=UΣΣTUTATA=(UΣVT)TUΣVT=VΣTUTUΣVT=VΣTΣVT
其中ΣΣT∈Rm×m\Sigma \Sigma^T\in R^{m\times m}ΣΣT∈Rm×m,ΣTΣ∈Rn×n\Sigma^T \Sigma \in R^{n\times n}ΣTΣ∈Rn×n,即:

ΣΣT=[σ1σ2⋱⋱]m×m\Sigma \Sigma^T= \begin{bmatrix} \sigma _1 \\ & \sigma _2 \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{m\times m} ΣΣT=⎣⎢⎢⎡​σ1​​σ2​​⋱​⋱​⎦⎥⎥⎤​m×m​

ΣTΣ=[σ1σ2⋱⋱]n×n\Sigma^T\Sigma= \begin{bmatrix} \sigma _1 \\ & \sigma _2 \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{n\times n} ΣTΣ=⎣⎢⎢⎡​σ1​​σ2​​⋱​⋱​⎦⎥⎥⎤​n×n​
可以看到ΣΣT\Sigma \Sigma^TΣΣT和ΣTΣ\Sigma^T \SigmaΣTΣ的形式非常接近,进一步分析,我们可以发现AATAA^TAAT和ATAA^TAATA也是对称矩阵,那么就可以做特征值分解(EVD)。对AATAA^TAAT特征值分解,得到的特征矩阵即为UUU 。对ATAA^TAATA特征值分解,得到的特征矩阵即为VVV 。对AATAA^TAAT或ATAA^TAATA中的特征值开方,可以得到所有的奇异值。
由此可求得特征值为σ1\sqrt{ \sigma _1}σ1​​ 、σ2\sqrt{ \sigma _2}σ2​​ 、…、σk\sqrt{ \sigma _k}σk​​ 。所以矩阵AAA:
A=UΣVT=[u1u2⋯um][σ1σ2⋱⋱]m×n[v1v2⋮vn]A=U\Sigma V^T= \begin{bmatrix} u_1 &u_2&\cdots&u_m\ \end{bmatrix}\begin{bmatrix} \sqrt{\sigma _1} \\ &\sqrt{ \sigma _2} \\ & & \ddots \\ & & &\ddots \\ \end{bmatrix}_{m\times n} \begin{bmatrix} v_1 \\ v_2 \\ \vdots \\ v_n \\ \end{bmatrix} A=UΣVT=[u1​​u2​​⋯​um​ ​]⎣⎢⎢⎡​σ1​​​σ2​​​⋱​⋱​⎦⎥⎥⎤​m×n​⎣⎢⎢⎢⎡​v1​v2​⋮vn​​⎦⎥⎥⎥⎤​
进一步化简得到
A=σ1u1v1T+σ2u2v2T+⋯+σkukvkTA=\sqrt{\sigma _1} u_1v_1^T+\sqrt{\sigma _2} u_2v_2^T+\cdots+\sqrt{\sigma _k} u_kv_k^T A=σ1​​u1​v1T​+σ2​​u2​v2T​+⋯+σk​​uk​vkT​
即:
A=λ1u1v1T+λ2u2v2T+⋯+λkukvkTA=\lambda _1 u_1v_1^T+\lambda_2 u_2v_2^T+\cdots+\lambda _k u_kv_k^T A=λ1​u1​v1T​+λ2​u2​v2T​+⋯+λk​uk​vkT​
矩阵AAA被分解为kkk个小矩阵,每个矩阵都是λ\lambdaλ乘以uiviTu_iv_i^Tui​viT​。此时可以看到,若λ\lambdaλ取值较大,其对应的矩阵在矩阵AAA的占比也大,所以取以去前面主要的λ\lambdaλ来近似代表系统,近似的系统可以表示为:
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nTA_{m\times n}=U_{m\times m}\Sigma _{m\times n}V^T_{n\times n} \approx U_{m\times k}\Sigma _{k\times k}V^T_{k\times n} Am×n​=Um×m​Σm×n​Vn×nT​≈Um×k​Σk×k​Vk×nT​

3.奇异值分解的价值

  这种近似的应用就是SVD分解的主要价值,可以用来数据的降维或者减少数据的存储空间。例如原先矩阵A∈Rm×nA\in R^{m\times n}A∈Rm×n需要存储的数据为m×nm\times nm×n个,而将其按照特征值分解后,假如只取第一个分量近似其矩阵的话,则存储的数据为 m+n+1m+n+1m+n+1个,为保证其尽可能的近似于原矩阵,特征值可以选取前kkk个,则其存储的数据为k×(m+n+1)k\times (m+n+1)k×(m+n+1)个,显然大大减少了存储空间。

三、SVD分解在图像处理中的应用

3.1图像处理分析

  在图像处理中,往往要面对数据量比较大的图像。然而在实际的问题处理中,只需要提取图像的主要特征即可,不需要对其所有的数据进行处理,此时便需要提取主要的特征。例如下方的一张700×500×3700{\times}500{\times}3700×500×3的图片,其数据量为700×500×3=1050000700{\times}500{\times}3=1050000700×500×3=1050000个。对于这样的一张图片,其需要的存储空间为1050000个字节。运用SVD分解可以合理的减少其存储空间,从而大大简化后续的图像的其他操作的运算空间。下面介绍如何对一幅图像进行SVD分解,并得到其主要特征。

3.2SVD分解python代码

参考

import numpy as np
import matplotlib.image as mping
import matplotlib.pyplot as plt
import matplotlib as mpldef image_svd(n, pic):a, b, c = np.linalg.svd(pic)#a,b,c= U,sigma,VTsvd = np.zeros((a.shape[0], c.shape[1]))for i in range(0, n):svd[i, i] = b[i]img = np.matmul(a, svd)img = np.matmul(img, c)img[img >= 255] = 255img[0 >= img] = 0img = img.astype(np.uint8)return imgif __name__ == '__main__':mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = Falsepath = './cat.jpg'img = mping.imread(path)print(img.shape)r = img[:, :, 0]g = img[:, :, 1]b = img[:, :, 2]plt.figure(figsize=(50, 100))for i in range(1, 31):r_img = image_svd(i, r)g_img = image_svd(i, g)b_img = image_svd(i, b)pic = np.stack([r_img, g_img, b_img], axis=2)print(i)plt.subplot(5, 6, i)plt.title("图像的SVD分解,使用前 %d 个特征值" % (i))plt.axis('off')plt.imshow(pic)plt.suptitle("图像的SVD分解")plt.subplots_adjust()plt.show()

3.3输出结果

  通过分析结果图可以发现,不同数量的奇异值返回的图像效果不同。如果只取前5个奇异值,返回的图像较模糊,返回前15个奇异值的图像,则能较好的表现原图像,而返回30个奇异值生成的图像,则几乎与原图像误差,根据不同的应用场合,可以合理的选取奇异值,这样的大大简化了原先700个奇异值的运算。

四、用Eigen库实现SVD分解

用Eigen库实现SVD分解。

五、SVD分解的优点

1.内存少
  奇异值分解矩阵中Σ\SigmaΣ里面的奇异值按从大到小的顺序排列,奇异值从大到小的顺序减小的特别快。在大多数情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上。也就是说,剩下的90%甚至99%的奇异值几乎没有什么作用。因此,可以用前面 个大的奇异值来近似描述矩阵,于是奇异值分解公式可以写成如下:
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVk×nTA_{m\times n}=U_{m\times m}\Sigma _{m\times n}V^T_{n\times n} \approx U_{m\times k}\Sigma _{k\times k}V^T_{k\times n} Am×n​=Um×m​Σm×n​Vn×nT​≈Um×k​Σk×k​Vk×nT​
其中kkk是一个远远小于mmm 和nnn 的数,右边的三个矩阵相乘的结果将会使一个接近AAA的矩阵。如果kkk越接近于nnn ,则相乘的结果越接近于AAA 。如果kkk 的取值远远小于nnn ,从计算机内存的角度来说,右边三个矩阵的存储内存要远远小于矩阵AAA 。
2.SVD可以获取两个方向的主成分
  左奇异矩阵UUU可以用于对行数的压缩;右奇异矩阵VVV可以用于对列(即特征维度)的压缩。
3.滤波作用
  由于SVD分解最终是取得了多个权重较大的奇异值,因此其余较小的奇异值会被舍去。往往这些小的奇异值表征的是一些杂波,即不相关的干扰数据,运用SVD分解取得重要特征之后,恰好可以滤掉这些干扰数据,从而起到滤波的作用。

奇异值SVD分解的应用探究相关推荐

  1. 奇异值(SVD)分解计算过程介绍

  2. 奇异值(Singular value decomposition SVD)分解

    本文摘自两篇博客,感谢博主分享 一.原文地址:http://blog.csdn.net/wangzhiqing3/article/details/7446444 SVD分解 SVD分解是LSA的数学基 ...

  3. 奇异值值分解。svd_推荐系统-奇异值分解(SVD)和截断SVD

    奇异值值分解.svd The most common method for recommendation systems often comes with Collaborating Filterin ...

  4. SVD(奇异值矩阵分解) 转载(+师兄ppt)

    http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html 一.奇异值与特征值基础知识: 特征值分解 ...

  5. SVD分解的推导,理解SVD分解及矩阵奇异值的几何意义

    文章目录 SVD分解的证明推导 从本质上理解SVD分解 矩阵奇异值的几何意义 SVD分解的证明推导 理解SVD分解要解决的问题是什么? 从本质上理解SVD分解 从线性映射的矩阵表示角度,即从" ...

  6. matlab计算奇异值和正交矩阵,奇异值、奇异矩阵、SVD分解、正交矩阵

    奇异值: 奇异值分解法是线性代数中一种重要的矩阵分解法,在信号处理.统计学等领域有重要应用. 定义:设A为m*n阶矩阵,A'表示A的转置矩阵,A'*A的n个特征值的非负平方根叫作A的奇异值.记为σi( ...

  7. SVD分解的并行实现

    在之前的文章中,我对SVD进行了大致的了解,它在互联网高端领域中有广泛的应用,至于它的一些详细应 用以后再进一步学习.现在主要的问题是如何有效地实现SVD分解,接下来我会先用两种方法来实现SVD分 解 ...

  8. 线性方程 最小二乘解 SVD分解

    线性方程 最小二乘解 SVD分解 - 洪伟的日志 - 网易博客 在做极线几何约束和运动恢复结构求取深度信息时,碰到了几个齐次方程和超定方程最小二乘解的问题.做一总结: 对于齐次线性方程 A*X =0; ...

  9. 李宏毅线性代数笔记13:SVD分解

    1 SVD分解介绍 之前用特征值来进行对角化的时候,被对角化的矩阵一定要是方阵,但是SVD的话,非方阵也是可以的. 矩阵Σ对角线上的元素都是大于等于0的 我们可以改变U,V的一些行和列,来达到Σ对角线 ...

最新文章

  1. 如何设置可见性Android软键盘
  2. 使用svm的一个常见错误
  3. 金叉成功率_技巧!三分钟教会你识别macd真假金叉,让你精准把握买卖点!
  4. 前端学习(1307):模块查找规则二
  5. 安装node.js、webpack、vue 和vue-cli 以及安装速度慢/不成功的解决方法
  6. window10保存文件时提示联系管理员_东芝2000AC扫描文件到远程域共享服务器
  7. centerOS环境变量配置
  8. MPai数据科学平台
  9. 【编程题m_0031】句子反转(小米2017秋招真题)
  10. linux centos7 docker 安装nginx 使用宿主机配置文件
  11. Linux 定时器 setitimer
  12. 几组数据的相关性python_几的笔顺 笔画数:2 拼音:jī,jǐ 部首:几 - 智慧山
  13. MyBatis-Plus--自动填充的用法
  14. FATE —— 二.4.2 Criteo上的联邦经典CTR模型训练
  15. 网易云音乐(netease-cloud-music)无法通过图标打开,只能用命令行开启
  16. Java对URL中的中文进行UrlEncode转码
  17. 线性代数的本质(二)——线性组合、张成空间和基
  18. JS-----------Ajax
  19. 什么是CC和DDOS攻击
  20. C语言笔记-连续赋值

热门文章

  1. 网上靠谱的赚钱方法,这四个可以尝试做一做!
  2. 计算机用户账户包括哪些组成部分,2016年职称计算机WindowsXP考前押题及答案4
  3. 云计算入门书籍,你有没有推荐
  4. Network Experiance - Cisco IP 电话 通过防火墙后无法注册
  5. C语言大专补考题目,C语言补考,求助4到大题目.
  6. oracle的sql if函数的使用方法,oracle基本sql语句和函数详解
  7. Echarts 给Y轴添加单位
  8. 端午临近,字节后端开发3+4面,终于拿到秋招第一个offer
  9. 热水器php2p3代表什么,海尔热水器 操作面板上的功率 P1 P2 P3 是啥意思,...-海尔变频热水器...
  10. keil与仿真电路的学习(一)