SVD的讲解

目录 ?

1️⃣ 简单说一下特征值、特征向量与特征分解
   I. 特征值、特征向量与特征分解
   II. 几何意义
   III. 如何实现通过Matlab、Python实现
2️⃣详细解说SVD
   I. 几何意义
   I. 奇异值分解的推导过程
   I. SVD算例
   I. 如何通过Matlab和Python
3️⃣应用举例
   I. 特征值、特征向量与特征分解
4️⃣特征分解、奇异值分解的区别
   I. 特征分解、奇异值分解的区别

简单说一下特征值、特征向量与特征分解

特征值、特征向量与特征分解

Theory:
对于一个正阵 M M M,满足如下:
M x = λ x Mx=\lambda x Mx=λx
其中 λ \lambda λ被成为特征值,满足 ∣ ∣ M − λ E ∣ ∣ = 0 ||M-\lambda E||=0 MλE=0再有 ( M − λ E ) x = 0 (M-\lambda E)x=0 (MλE)x=0,可计算其特征向量。
如果有了特征值和特征向量后呢,则可以将矩阵 M M M用特征分解:
M = W ∑ W − 1 M=W\sum W^{-1} M=WW1
W = w 1 , w 2 , . . . , w n W={w_1,w_2,...,w_n} W=w1,w2,...,wn分别是特征值 λ 1 , λ 2 , . . . , λ n \lambda_1,\lambda_2,...,\lambda_n λ1,λ2,...,λn对应的特征向量构成的方阵

几何意义

对应矩阵M,其对应的线性变化
M x = x ′ Mx = x' Mx=x
上面这个式子, M x , x ′ Mx,x' Mxx是一个向量, x , x ′ x,x' x,x可能是不共线的(如图(b)),如果向量 M x , x ′ Mx,x' Mx,x满足 M x = x ′ = λ x Mx=x'=\lambda x Mx=x=λx,则如图(b),这说明了这个变换就是对向量x做一个拉伸或者压缩。
在这里插入图片描述

如何实现通过Matlab、Python实现

数学推导:
M x = λ x Mx = \lambda x Mx=λx
M x − λ x = ( M − λ E ) x = 0 Mx-\lambda x=(M-\lambda E)x=0 Mxλx=(MλE)x=0
齐次线性方程组有非零解,则 ∣ ∣ M − λ E ∣ ∣ = 0 ||M-\lambda E||=0 MλE=0可求得特征向量
再带回,可得特征向量。
Matlab:

d = eig(M) % 求取矩阵M的特征值,向量形式存储
[V,D] = eig(M) % 计算M的特征值对角阵D和特征向量V,使得MV = VD成立
[V,D] = eig(M,'nobalance')   %当矩阵M中有与截断误差数量级相差不远的值时,该指令可能更精确。'nobalance'起误差调节作用

Python
numpy科学计算库提供相应的方法

import numpy as np

x = np.diag((1,2,3)) # 这是你想要求取特征值的数组
a,b = numpy.linalg.elg(x) # 特征值赋值给a,对应的特征向量赋值给b

详细解说SVD

SVD的英文全称: Singular Value Decomposition,中文名字:奇异值分解

几何意义

图来源
以二维空间为例
在这里插入图片描述
在这里插入图片描述
几何意义就是把一个单位正交的网格,转换为另外一个单位正交的网格
假如选取了一组单位正交基{ v ⃗ 1 , v ⃗ 2 \vec{v}_1,\vec{v}_2 v 1,v 2},刚好矩阵M的线性变化( M v ⃗ 1 M\vec{v}_1 Mv 1, M v ⃗ 2 M\vec{v}_2 Mv 2)也正交,用 u ⃗ 1 , u ⃗ 2 \vec{u}_1,\vec{u}_2 u 1,u 2分别表示 M v ⃗ 1 M\vec{v}_1 Mv 1, M v ⃗ 2 M\vec{v}_2 Mv 2的单位向量,用 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2表示 M v ⃗ 1 M\vec{v}_1 Mv 1, M v ⃗ 2 M\vec{v}_2 Mv 2的长度,描述网格在这些特定方向上的拉伸量,也被称作矩阵M的奇异值。
M v ⃗ 1 = λ 1 u ⃗ 1 M\vec{v}_1 =\lambda_1\vec{u}_1 Mv 1=λ1u 1
M v ⃗ 2 = λ 2 u ⃗ 2 M\vec{v}_2 =\lambda_2\vec{u}_2 Mv 2=λ2u 2
对任意给定的向量 x ⃗ \vec{x} x ,则有
x = ( v 1 ⋅ x ) v 1 + ( v 2 ⋅ x ) v 2 \mathbf{x}=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) \mathbf{v}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) \mathbf{v}_{2} x=(v1x)v1+(v2x)v2
再将M的线性变换
M x = ( v 1 ⋅ x ) M N 1 + ( v 2 ⋅ x ) M v 2 M x = ( v 1 ⋅ x ) σ 1 u 1 + ( v 2 ⋅ x ) σ 2 u 2 \begin{aligned} M \mathbf{x} &=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) M \mathbf{N}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) M \mathbf{v}_{2} \\ M \mathbf{x} &=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) \sigma_{1} \mathbf{u}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) \sigma_{2} \mathbf{u}_{2} \end{aligned} MxMx=(v1x)MN1+(v2x)Mv2=(v1x)σ1u1+(v2x)σ2u2
M x = u 1 σ 1 v 1 ⊤ x + u 2 σ 2 v 2 ⊤ x M = u 1 σ 1 v 1 ⊤ + u 2 σ 2 v 2 ⊤ \begin{array}{c}{M \mathbf{x}=\mathbf{u}_{1} \sigma_{1} \mathbf{v}_{1}^{\top} \mathbf{x}+\mathbf{u}_{2} \sigma_{2} \mathbf{v}_{2}^{\top} \mathbf{x}} \\ {M=\mathbf{u}_{1} \sigma_{1} \mathbf{v}_{1}^{\top}+\mathbf{u}_{2} \sigma_{2} \mathbf{v}_{2}^{\top}}\end{array} Mx=u1σ1v1x+u2σ2v2xM=u1σ1v1+u2σ2v2
so
M = U Σ V T M=U \Sigma V^{T} M=UΣVT

奇异值分解的推导过程

u = ( u 1 , u 2 , . . . , u m ) u=(u_1,u_2,...,u_m) u=(u1,u2,...,um)
v = ( v 1 , v 2 , . . . , v n ) v=(v_1,v_2,...,v_n) v=(v1,v2,...,vn)
u , v u,v u,v都是空间的基,是正交矩阵 u T u = E , v T v = E u^Tu=E,v^Tv = E uTu=E,vTv=E
在这里插入图片描述
任何一个矩阵 M m ∗ n M_{m*n} Mmn r a n k ( M ) = k rank(M)=k rank(M)=k,一定存在SVD,换句话说,M可以将一组单位正交基映射到另一组单位正交基。答案是肯定的
证明如下:
在n为空间中,有一组单位正交基{ v ⃗ 1 , v ⃗ 2 , . . . , v ⃗ n \vec{v}_1,\vec{v}_2,...,\vec{v}_n v 1,v 2,...,v n},线性变化作用以后
M v ⃗ 1 , M v ⃗ 2 , . . . , M v ⃗ n {M\vec{v}_1,M\vec{v}_2,...,M\vec{v}_n} Mv 1,Mv 2,...,Mv n
也是正交的,则有
( M v ⃗ i , M v ⃗ j ) = ( M x ⃗ i ) T M v ⃗ j = v ⃗ i T M T M v ⃗ j = 0 (M\vec{v}_i,M\vec{v}_j) = (M\vec{x}_i)^TM\vec{v}_j=\vec{v}_i^TM^TM\vec{v}_j=0 (Mv i,Mv j)=(Mx i)TMv j=v iTMTMv j=0
注意喔, M T M M^TM MTM是矩阵喔,则会有 M T M v ⃗ j = λ v ⃗ j M^TM\vec{v}_j=\lambda \vec{v}_j MTMv j=λv j
接下去,
v i T M T M v j = v i T λ j v j = λ j v i T v j = λ j v i v ˙ j = 0 \begin{aligned} v_{i}^{T} M^{T} \mathrm{M} v_{j}=& v_{i}^{T} \lambda_{j} v_{j} \\ &=\lambda_{j} v_{i}^{T} v_{j} \\ &=\lambda_{j} v_{i}\dot v_{j}=0 \end{aligned} viTMTMvj=viTλjvj=λjviTvj=λjviv˙j=0
上述就证明了是有的:任何一个矩阵,都可以将一组单位正交基转换成另外一组正交基。
i = j i=j i=j, &lt; M v ⃗ i , M v ⃗ i &gt; = λ i v ⃗ i v ⃗ i = λ i &lt;M\vec{v}_i,M \vec{v}_i&gt;=\lambda_i \vec{v}_i \vec{v}_i =\lambda_i <Mv i,Mv i>=λiv iv i=λi
进行一些单位化,记 u i = A v ⃗ i ∣ M v ⃗ i ∣ = 1 λ i M v ⃗ i u_i=\frac{A\vec{v}_i}{|M\vec{v}_i|}=\frac{1}{\sqrt{\lambda_i}}M\vec{v}_i ui=Mv iAv i=λi 1Mv i

A v i = σ i u i , σ i ( 奇异值 ⁡ ) = λ i , 0 ≤ i ≤ k , k = Rank ⁡ ( A ) A v_{i}=\sigma_{i} u_{i}, \sigma_{i}(\operatorname{奇异值})=\sqrt{\lambda_{i}}, 0 \leq i \leq \mathrm{k}, \mathrm{k}=\operatorname{Rank}(\mathrm{A}) Avi=σiui,σi()=λi ,0ik,k=Rank(A)
k &lt; i &lt; = m k &lt; i &lt;= m k<i<=m时,对 u 1 , u 2 , . . . , u k u1,u2,...,uk u1u2...uk进行扩展 u ( k + 1 ) , . . . , u m u(k+1),...,um u(k+1),...,um,使得 u 1 , u 2 , . . . , u m u1,u2,...,um u1u2...um m m m维空间中的一组正交基.也可对 v ⃗ 1 , v ⃗ 2 , . . . , v ⃗ k \vec{v}_1,\vec{v}_2,...,\vec{v}_k v 1,v 2,...,v k进行扩展,扩展的 v ⃗ k + 1 , . . . , v ⃗ n \vec{v}_{k+1},...,\vec{v}_{n} v k+1,...,v n存在零子空间里面。
M [ v ⃗ 1 ⋯ v ⃗ k ∣ v ⃗ k + 1 ⋯ v ⃗ m ] = [ u ⃗ 1 T ⋮ u ⃗ k T u ⃗ k + 1 ⋮ u ⃗ n T ] [ σ 1 0 0 ⋱ σ k 0 0 0 0 ] M\left[ \begin{array}{lll}{\vec{v}_{1}} &amp; {\cdots} &amp; {\vec{v}_{k}}\end{array}\right| \vec{v}_{k+1} \quad \cdots \quad \vec{v}_{m} ]= \left[ \begin{array}{c}{\vec{u}_{1}^{T}} \\ {\vdots} \\ {\frac{\vec{u}_{k}^{T}}{\vec{u}_{k+1}}} \\ {\vdots} \\ {\vec{u}_{n}^{T}}\end{array}\right] \left[ \begin{array}{ccc|c}\sigma_{1} &amp; &amp; 0 &amp; 0\\ &amp; {\ddots} &amp; \sigma_{k} &amp; 0 \\ \hline 0 &amp; &amp; 0 &amp;0\end{array}\right] M[v 1v kv k+1v m]=u 1Tu k+1u kTu nTσ100σk0000
M = [ u ⃗ 1 ⋯ u ⃗ k ] [ σ 1 ⋱ σ k ] [ v ⃗ 1 T ⋮ v ⃗ k T ] + [ u ⃗ k + 1 ⋯ u ⃗ m ] [ 0 ] [ v ⃗ k + 1 T ⋮ v ⃗ n T ] M=\left[ \begin{array}{lll}{\vec{u}_{1}} &amp; {\cdots} &amp; {\vec{u}_{k}}\end{array}\right] \left [ \begin{array}{ccc}\sigma_{1} &amp; &amp; \\ &amp; {\ddots} &amp; \\ &amp; &amp; {\sigma_{k}}\end{array}\right] \left[ \begin{array}{c}{\vec{v}_{1}^{T}} \\ {\vdots} \\ {\vec{v}_{k}^{T}}\end{array}\right]+ \left[ \begin{array}{ccc}{\vec{u}_{k+1}} &amp; {\cdots} &amp; {\vec{u}_{m}}\end{array}\right] \left[\begin{array}{c} 0 \end{array} \right] \left[ \begin{array}{c}{\vec{v}_{k+1}^{T}} \\ {\vdots} \\ {\vec{v}_{n}^{T}}\end{array}\right] M=[u 1u k]σ1σkv 1Tv kT+[u k+1u m][0]v k+1Tv nT

SVD算例

U: A A T AA^T AAT的特征值和特征向量,用单位化的特征向量构成 U U U
V: A T A A^TA ATA 的特征值和特征向量,用单位化的特征向量构成 V V V
∑ m n \sum_{mn} mn : 将 A A T AA^{T} AAT或者 A T A A^{T}A ATA 的特征值求平方根,然后构成 Σ
以矩阵 A = [ 1 1 1 1 0 0 ] A = \left[\begin{matrix} 1 &amp; 1\\1 &amp;1\\ 0 &amp;0\\\end{matrix} \right] A=110110
第一步 U ,下面是一种计算方法
对矩阵 A A T = [ 2 2 0 2 2 0 0 0 0 ] A A^{T}=\left[ \begin{array}{lll}{2} &amp; {2} &amp; {0} \\ {2} &amp; {2} &amp; {0} \\ {0} &amp; {0} &amp; {0}\end{array}\right] AAT=220220000特征分解,
特征是4,0,0
特征向量是
[ 1 2 , 1 2 , 0 ] T , [ − 1 2 , 1 2 , 0 ] T , [ 0 , 0 , 1 ] T \left[\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}, 0\right]^{T},\left[-\frac{1}{\sqrt{2}}, \frac{1}{\sqrt{2}}, 0\right]^{T},[0,0,1]^{T} [2 1,2 1,0]T,[2 1,2 1,0]T,[0,0,1]T,可得到
U = [ 1 2 − 1 2 0 1 2 1 2 0 0 0 1 ] U=\left[ \begin{array}{ccc}{\frac{1}{\sqrt{2}}} &amp; {-\frac{1}{\sqrt{2}}} &amp; {0} \\ {\frac{1}{\sqrt{2}}} &amp; {\frac{1}{\sqrt{2}}} &amp; {0} \\ {0} &amp; {0} &amp; {1}\end{array}\right] U=2 12 102 12 10001

第二步
计算矩阵 A T A A^TA ATA的特征分解,可得
特征值4,0,
V = [ 1 2 − 1 2 1 2 1 2 ] V=\left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} &amp; {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} &amp; {\frac{1}{\sqrt{2}}}\end{array}\right] V=[2 12 12 12 1]
第三步
计算 ∑ m n \sum_{mn} mn
Σ = [ 2 0 0 0 0 0 ] \Sigma=\left[ \begin{array}{ll}{2} &amp; {0} \\ {0} &amp; {0} \\ {0} &amp; {0}\end{array}\right] Σ=200000
最后,
A = U Σ V T = [ 1 2 − 1 2 0 1 2 1 2 0 0 0 1 ] [ 2 0 0 0 0 0 ] [ 1 2 − 1 2 1 2 1 2 ] T = [ 1 1 1 1 0 0 ] A=U \Sigma V^{T}=\left[ \begin{array}{ccc}{\frac{1}{\sqrt{2}}} &amp; {-\frac{1}{\sqrt{2}}} &amp; {0} \\ {\frac{1}{\sqrt{2}}} &amp; {\frac{1}{\sqrt{2}}} &amp; {0} \\ {0} &amp; {0} &amp; {1}\end{array}\right] \left[ \begin{array}{ll}{2} &amp; {0} \\ {0} &amp; {0} \\ {0} &amp; {0}\end{array}\right] \left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} &amp; {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} &amp; {\frac{1}{\sqrt{2}}}\end{array}\right]^{T}=\left[ \begin{array}{cc}{1} &amp; {1} \\ {1} &amp; {1} \\ {0} &amp; {0}\end{array}\right] A=UΣVT=2 12 102 12 10001200000[2 12 12 12 1]T=110110

如何通过Matlab和Python

Matlab:

s = svd(A)
[U,S,V] = svd(A)
[U,S,V] = svd(A,'econ')
[U,S,V] = svd(A,0)
input: A 矩阵
output:
        s:奇异值,以列向量形式返回。奇异值是以降序顺序列出的非负实数
        S:
        U:左奇异向量,以矩阵的列形式返回。
        V:奇异值,以对角矩阵形式返回。S 的对角元素是以降序排列的非负奇异值。
        右奇异向量,以矩阵的列形式返回。

Python

import numpy as np
M = np.array([ [1,1,2],[0,0,1]])
U,S,V  = np.linalg.svd(M)

应用举例

应用

2.1 信息检索
2.2 推荐系统
2.3 基于协同过滤的推荐系统
2.4 图像压缩

特征值分解和奇异值分解的区别

  1. 特征值分解只能是方阵,而奇异值分解是矩阵就可以
  2. 特征值分解只考虑了对矩阵缩放效果,奇异值分解对矩阵有选择、收缩、投影的效果
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值