SVD(奇异值分解)小结
注:奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,并且举一个图片压缩的例子,最后做一个简单的分析,希望能够给大家带来帮助。
1、特征值分解(EVD)
实对称矩阵
在理角奇异值分解之前,需要先回顾一下特征值分解,如果矩阵\(A\)是一个\(m\times m\)的实对称矩阵(即\(A = A^T\)),那么它可以被分解成如下的形式
Q\left[
\begin{matrix}
\lambda_1 & \cdots & \cdots & \cdots\\
\cdots & \lambda_2 & \cdots & \cdots\\
\cdots & \cdots & \ddots & \cdots\\
\cdots & \cdots & \cdots & \lambda_m\\
\end{matrix}
\right]Q^T
\tag{1-1}
\]
其中\(Q\)为标准正交阵,即有\(QQ^T = I\),\(\Sigma\)为对角矩阵,且上面的矩阵的维度均为\(m\times m\)。\(\lambda_i\)称为特征值,\(q_i\)是\(Q\)(特征矩阵)中的列向量,称为特征向量。
注:\(I\)在这里表示单位阵,有时候也用\(E\)表示单位阵。式(1-1)的具体求解过程就不多叙述了,可以回忆一下大学时的线性代数。简单地有如下关系:\(Aq_i = \lambda_i q_i, \quad q_i^T q_j = 0(i \ne j)\)。
一般矩阵
上面的特征值分解,对矩阵有着较高的要求,它需要被分解的矩阵\(A\)为实对称矩阵,但是现实中,我们所遇到的问题一般不是实对称矩阵。那么当我们碰到一般性的矩阵,即有一个\(m \times n\)的矩阵\(A\),它是否能被分解成上面的式(1-1)的形式呢?当然是可以的,这就是我们下面要讨论的内容。
2、奇异值分解(SVD)
2.1 奇异值分解定义
有一个\(m \times n\)的实数矩阵\(A\),我们想要把它分解成如下的形式
\tag{2-1}
\]
其中\(U\)和\(V\)均为单位正交阵,即有\(UU^T=I\)和\(VV^T=I\),\(U\)称为左奇异矩阵,\(V\)称为右奇异矩阵,\(\Sigma\)仅在主对角线上有值,我们称它为奇异值,其它元素均为0。上面矩阵的维度分别为\(U \in R^{m\times m},\ \Sigma \in R^{m\times n},\ V \in R^{n\times n}\)。
一般地\(\Sigma\)有如下形式
\left[
\begin{matrix}
\sigma_1 & 0 & 0 & 0 & 0\\
0 & \sigma_2 & 0 & 0 & 0\\
0 & 0 & \ddots & 0 & 0\\
0 & 0 & 0 & \ddots & 0\\
\end{matrix}
\right]_{m\times n}
\]
图1-1 奇异值分解
对于奇异值分解,我们可以利用上面的图形象表示,图中方块的颜色表示值的大小,颜色越浅,值越大。对于奇异值矩阵\(\Sigma\),只有其主对角线有奇异值,其余均为0。
2.2 奇异值求解
正常求上面的\(U,V,\Sigma\)不便于求,我们可以利用如下性质
\tag{2-2}
\]
\tag{2-3}
\]
注:需要指出的是,这里\(\Sigma\Sigma^T\)与\(\Sigma^T\Sigma\)在矩阵的角度上来讲,它们是不相等的,因为它们的维数不同\(\Sigma\Sigma^T \in R^{m \times m}\),而\(\Sigma^T\Sigma \in R^{n \times n}\),但是它们在主对角线的奇异值是相等的,即有
\[\Sigma\Sigma^T =
\left[
\begin{matrix}
\sigma_1^2 & 0 & 0 & 0\\
0 & \sigma_2^2 & 0 & 0\\
0 & 0 & \ddots & 0 \\
0 & 0 & 0 & \ddots \\
\end{matrix}
\right]_{m\times m}\quad
\Sigma^T\Sigma =
\left[
\begin{matrix}
\sigma_1^2 & 0 & 0 & 0\\
0 & \sigma_2^2 & 0 & 0\\
0 & 0 & \ddots & 0\\
0 & 0 & 0 & \ddots\\
\end{matrix}
\right]_{n\times n}
\]
可以看到式(2-2)与式(1-1)的形式非常相同,进一步分析,我们可以发现\(AA^T\)和\(A^TA\)也是对称矩阵,那么可以利用式(1-1),做特征值分解。利用式(2-2)特征值分解,得到的特征矩阵即为\(U\);利用式(2-3)特征值分解,得到的特征矩阵即为\(V\);对\(\Sigma\Sigma^T\)或\(\Sigma^T\Sigma\)中的特征值开方,可以得到所有的奇异值。
3、奇异值分解应用
3.1 纯数学例子
假设我们现在有矩阵\(A\),需要对其做奇异值分解,已知
\left[
\begin{matrix}
1 & 5 & 7 & 6 & 1 \cr
2 & 1 & {10} & 4 & 4 \cr
3 & 6 & 7 & 5 & 2 \cr
\end{matrix}
\right]
\]
那么可以求出\(AA^T\)和\(A^TA\),如下
\left[
\begin{matrix}
112 & 105 & 114 \cr
105 & 137 & 110 \cr
114 & 110 & 123 \cr
\end{matrix}
\right] \quad
A^TA =
\left[
\begin{matrix}
14 & 25 & 48 & 29 & 15 \\
25 & 62 & 87 & 64 & 21 \\
48 & 87 & 198 & 117 & 61 \\
29&64&117&77&32\\
15&21&61&32&21
\end{matrix}
\right]
\]
分别对上面做特征值分解,得到如下结果
U =
[[-0.55572489, -0.72577856, 0.40548161],
[-0.59283199, 0.00401031, -0.80531618],
[-0.58285511, 0.68791671, 0.43249337]]
V =
[[-0.18828164, -0.01844501, 0.73354812, 0.65257661, 0.06782815],
[-0.37055755, -0.76254787, 0.27392013, -0.43299171, -0.17061957],
[-0.74981208, 0.4369731 , -0.12258381, -0.05435401, -0.48119142],
[-0.46504304, -0.27450785, -0.48996859, 0.39500307, 0.58837805],
[-0.22080294, 0.38971845, 0.36301365, -0.47715843, 0.62334131]]
奇异值\(\Sigma = \text{Diag}(18.54, 1.83, 5.01)\)
3.2 在图像压缩中的应用
准备工具
下面的代码运行环境为python3.6+jupyter5.4
SVD(Python)
这里暂时用numpy自带的svd函数做图像压缩。
①读取图片
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img_eg = mpimg.imread("../img/beauty.jpg")
print(img_eg.shape)
图片的大小是\(600\times 400 \times 3\)
②奇异值分解
img_temp = img_eg.reshape(600, 400 * 3)
U,Sigma,VT = np.linalg.svd(img_temp)
我们先将图片变成\(600\times 1200\),再做奇异值分解。从svd函数中得到的奇异值sigma它是从大到小排列的。
③取前部分奇异值重构图片
# 取前60个奇异值
sval_nums = 60
img_restruct1 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct1 = img_restruct1.reshape(600,400,3)
# 取前120个奇异值
sval_nums = 120
img_restruct2 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct2 = img_restruct2.reshape(600,400,3)
将图片显示出来看一下,对比下效果
fig, ax = plt.subplots(1,3,figsize = (24,32))
ax[0].imshow(img_eg)
ax[0].set(title = "src")
ax[1].imshow(img_restruct1.astype(np.uint8))
ax[1].set(title = "nums of sigma = 60")
ax[2].imshow(img_restruct2.astype(np.uint8))
ax[2].set(title = "nums of sigma = 120")
图3-1 奇异值重构图片
可以看到,当我们取到前面120个奇异值来重构图片时,基本上已经看不出与原图片有多大的差别。
注:上面的美女图片源于网络,侵删。
总结
从上面的图片的压缩结果中可以看出来,奇异值可以被看作成一个矩阵的代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,就可以基本上还原出数据本身。
如下,可以作出奇异值数值变化和前部分奇异值和的曲线图,如下图所示
奇异值变化图
从上面的第1个图,可以看出,奇异值下降是非常快的,因此可以只取前面几个奇异值,便可基本表达出原矩阵的信息。从第2个图,可以看出,当取到前100个奇异值时,这100个奇异值的和已经占总和的95%左右。
最后,还有一点需要提到的是,如果自己想不调用np.linalg.svd函数,手动实现奇异值分解的话,单纯利用第2小节的内容实现,有点不够,有个问题需要注意。这里暂时不多做讨论了,大家有兴趣可以看我下面分享的《SVD(奇异值分解)Python实现》,重点可以看看其中SVD算法实现。
SVD(奇异值分解)小结的更多相关文章
- SVD奇异值分解的基本原理和运用
SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...
- SVD奇异值分解的几何物理意义资料汇总
学习SVD奇异值分解的网上资料汇总: 1. 关于svd的一篇概念文,这篇文章也是后续几篇文章的鼻祖~ http://www.ams.org/samplings/feature-column/fcarc ...
- [机器学习]-SVD奇异值分解的基本原理和运用
SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...
- 『科学计算_理论』SVD奇异值分解
转载请声明出处 SVD奇异值分解概述 SVD不仅是一个数学问题,在工程应用中的很多地方都有它的身影,比如前面讲的PCA,掌握了SVD原理后再去看PCA那是相当简单的,在推荐系统方面,SVD更是名声大噪 ...
- 简单易学的机器学习算法—SVD奇异值分解
简单易学的机器学习算法-SVD奇异值分解 一.SVD奇异值分解的定义 假设M是一个的矩阵,如果存在一个分解: 其中的酉矩阵,的半正定对角矩阵,的共轭转置矩阵,且为的酉矩阵.这样的分解称为M的奇 ...
- 奇异值分解(SVD)小结
SVD(奇异值分解)真的是一个神奇的东西,这里就写个小结. 其实原理并不是那么难理解. 它在数据去噪方面和降维上有特殊作用,也与PCA有很大的联系. 首先我们先回顾一下 EVD,特征值分解,可以对SV ...
- 对SVD奇异值分解的理解
首先推荐一篇博客,奇异值分解(SVD)原理详解及推导 - CSDN博客,讲解的很清楚.这里我谈谈自己的理解,方便以后回顾. 如果把向量理解为空间中的一个元素,那么矩阵可以理解为两个空间上的映射 ...
- Deep Learning基础--SVD奇异值分解
矩阵奇异值的物理意义是什么?如何更好地理解奇异值分解?下面我们用图片的例子来扼要分析. 矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition ...
- 机器学习(十七)— SVD奇异值分解
奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...
- 机器学习降维--SVD奇异值分解
奇异值分解是有着很明显的物理意义,将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性,让机器学会抽取重要的特征,SVD是一个重要的方法. 所以SVD不仅是一个 ...
随机推荐
- MySql 利用mysql&mysqldum导入导出数据
MySql 利用mysql&mysqldum导入导出数据 by:授客 QQ:1033553122 测试环境 Linux下测试,数据库MySql 工具 mysqldump,该命令位于mysq ...
- redis学习历程
redis只知道作用于缓存,其它一无所知,所以现在系统的 学习下,这样应用的时候可以考虑多面性和实用性 首先先了解一下redis的背景和概念 背景 Redis是一个开源的使用ANSI C语言编写.支持 ...
- 解决 jQuery validation插件 valid()方法总是返回true的问题
在表单元素验证方法中加入了 remote 方法,调试一直返回true,后来才知道因为是异步验证,所以才会出现此问题,解决方法就是在 remote 方法中,禁用 异步和缓存,具体代码如下 : ..... ...
- Apache,PHP,MySQL独立安装
最近在工作中常常接触到PHP,自己也写过一些简单的PHP页面.我们知道PHP是在服务器端运行的脚本语言,因此我们需要配置服务器环境.之前为了省事直接使用的是wamp集成环境,但是突然某一天领导要求我们 ...
- excel、xls文件读写操作
python 常用的excel.xls文件读写操作,有两个模块 xlrd:读 xlwt:写 本次先写一个读的例子: class CaseData(object): def __init__(self, ...
- pycharm的常用快捷键
使用pycharm写代码时,如果有错误,一般代码右边会有红色标记. 1,写代码时忘记导入模块,可以使用快捷键 Alt + Enter 自动导入模块.() 再倒入模块之前,需要现在pycharm ...
- Visual Basic 6.0(VB6.0)详细安装过程
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用. 特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如 ...
- mtime参数的理解
mtime参数的理解应该如下:-mtime n 按照文件的更改时间来找文件,n为整数.n表示文件更改时间距离为n天, -n表示文件更改时间距离在n天以内,+n表示文件更改时间距离在n天以前.例如:-m ...
- 2.3.1 TextView(文本框)详解
http://www.runoob.com/w3cnote/android-tutorial-textview.html 1.基础属性详解: 通过下面这个简单的界面,我们来了解几个最基本的属性: 布局 ...
- Redis 4.x 安装及 发布/订阅实践和数据持久化设置
1.或者源码安装包 #wget http://download.redis.io/releases/redis-4.0.6.tar.gz 2.解压源码包 #tar -zxf redis-4.0.6.t ...