IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 奇异值分解(SVD) -> 正文阅读

[人工智能]奇异值分解(SVD)

什么是奇异值分解

SVD是一种矩阵分解算法,在某些情况下,矩阵具有特定的结构,如果矩阵中有规则或简单的结构,那么分解矩阵将是有意义的。先看以下几个例子:

例子1.以下是一个所有元素值都相等的矩阵

A = ( 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 ) A=\begin{pmatrix} 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 \end{pmatrix} A=?????????111111?111111?111111?111111?111111?111111??????????
如果要保存这个矩阵,通常可以压缩这个矩阵,压缩的方法有很多,此时如果用向量积的方式实现,如下所示:
A = ( 1 1 1 1 1 1 ) ( 1 1 1 1 1 1 ) A=\begin{pmatrix} 1\\ 1\\ 1\\ 1\\ 1\\ 1 \end{pmatrix}\begin{pmatrix} 1 &1 &1 &1 &1 &1 \end{pmatrix} A=?????????111111??????????(1?1?1?1?1?1?)
此时只需保存12个元素,而不是36个元素
例子2.意大利国旗
在这里插入图片描述
意大利国旗可以写成以下矩阵形式:
A = ( g g w w r r g g w w r r g g w w r r g g w w r r g g w w r r g g w w r r ) A=\begin{pmatrix} g &g &w &w &r &r \\ g &g &w &w &r &r \\ g &g &w &w &r &r \\ g &g &w &w &r &r \\ g &g &w &w &r &r \\ g &g &w &w &r &r \end{pmatrix} A=?????????gggggg?gggggg?wwwwww?wwwwww?rrrrrr?rrrrrr??????????
同样的,也能用一种非常好的方式来压缩它,如下:
A = ( 1 1 1 1 1 1 ) ( g g w w r r ) A=\begin{pmatrix} 1\\ 1\\ 1\\ 1\\ 1\\ 1 \end{pmatrix}\begin{pmatrix} g & g & w &w &r &r \end{pmatrix} A=?????????111111??????????(g?g?w?w?r?r?)

例子3:现有如下矩阵A
A = ( 1 0 1 1 ) A=\begin{pmatrix} 1 &0 \\ 1 &1 \end{pmatrix} A=(11?01?)
分解这样的矩阵可以考虑用以上的方法,显然,不能只用一对行列向量完成分解。可以考虑将矩阵分解为两项的和(差),如下:

A = ( 1 1 ) ( 1 1 ) ? ( 1 0 ) ( 0 1 ) A=\begin{pmatrix} 1\\ 1 \end{pmatrix}\begin{pmatrix} 1 &1 \end{pmatrix}-\begin{pmatrix} 1\\ 0 \end{pmatrix}\begin{pmatrix} 0 &1 \end{pmatrix} A=(11?)(1?1?)?(10?)(0?1?)
那么奇异值分解实际上在做什么?
SVD将矩阵分解为一组向量v(可以看成多个列向量)、一组向量u(可以看成多个行向量)和一个对角矩阵(可以看成多个标量),即将矩阵分解为多项式。
如果有一个秩r=2的矩阵,我们可以将矩阵分解为
u 1 v 1 T + u 2 v 2 T u_{1}v_{1}^{T}+u_{2}v_{2}^{T} u1?v1T?+u2?v2T?
如果有一个秩r=1的矩阵,结果如下
u 1 v 1 T u_{1}v_{1}^{T} u1?v1T?
稍微复杂一点的分解是添加标量\alpha存储在对角矩阵中,对于秩r=2的矩阵,分解结果如下
σ 1 u 1 v 1 T + σ 2 u 2 v 2 T \sigma _{1}u_{1}v_{1}^{T}+\sigma _{2}u_{2}v_{2}^{T} σ1?u1?v1T?+σ2?u2?v2T?
显然,sigma值可以认为是加权系数。

SVD的特征向量

从以上例子可以看出,任何矩阵都可以分解为向量u和向量v,现在需要思考的是矩阵是如何分解的,SVD的思想如下:
A = U Σ V T A=U\Sigma V^{T} A=UΣVT

  • 向量U为左奇异向量,它是AA^T的单位向量
  • 向量V为右奇异向量,它是A^TA的单位向量
  • sigma为奇异值(\Sigma 对角线上的元素),它是AA^T的特征值的平方根

通过以下公式计算特征向量U:
A A T u i = σ i 2 u i AA^{T}u_{i}=\sigma _{i}^{2}u_{i} AATui?=σi2?ui?

SVD定义

由上节可知,SVD分解会得到一组新的矩阵,如果将它们相乘的话,将得到原始矩阵。奇异值分解的思想是将这个矩阵分解为三项的乘积,这三项分别为矩阵U、、V。
A = ( ? ? ? ? a 1 a 2 ? a m ? ? ? ? ) = U Σ V T A=\begin{pmatrix} \vdots &\vdots &\vdots &\vdots \\ a_{1}&a_{2} & \cdots &a_{m} \\ \vdots &\vdots &\vdots &\vdots \end{pmatrix}=U\Sigma V^{T} A=??????a1????a2????????am????????=UΣVT
矩阵A是m列向量,长度为n,即A的维度为mxn,
矩阵U的维度为nxn,
矩阵V的维度为mxm,
矩阵D的维度为nxm
d i m { A } = n × m d i m { U } = n × n d i m { Σ } = n × m d i m { V } = m × m dim\left \{ A \right \}=n\times m\\ dim\left \{ U \right \}=n\times n\\ dim\left \{ \Sigma \right \}=n\times m \\ dim\left \{ V \right \}=m\times m dim{A}=n×mdim{U}=n×ndim{Σ}=n×mdim{V}=m×m

用图像进行解释说明,矩阵A可以认为将图像进行矢量化并存储为列,矩阵U可以认为与A中的列对应的相似列。与特征向量类似,我们将这些“向量面”成为特征面,用特征面来表示人脸,这是图像处理和计算机视觉中用于人脸分析的基本方法。
在这里插入图片描述
矩阵U和V为实对称矩阵,即将U和UT相乘、V和VT相乘,得到的是单位矩阵。
在这里插入图片描述
因此,
在这里插入图片描述

应用

输入一张人脸图像

faces = X[0,:].reshape((64,64))

通过奇异值进行分解

# we decompose the image of a face
U, S, VT = np.linalg.svd(faces)
S = np.diag(S)
faces = faces.astype('float')
#U, VT = truncate_u_v(S, U, VT)
draw_svd(faces, U, S, VT, 'gray')

输出为:
在这里插入图片描述
可以求出前30个特征值

diag_elem = np.diag(S)
plt.stem(diag_elem[1:])

在这里插入图片描述
当然,这里可以取前n个特征值进行重建,剩下的特征值舍弃,显然,取得的特征值越多,图像的轮廓越清晰。因为越靠前的特征值和特征向量,权重越大,越靠后,权重越小。

ps:如果矩阵A为mxn,用奇异值分解,如果A是方阵,用特征值分解即可。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-30 12:03:49  更:2021-08-30 12:06:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 17:33:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码