目录 ????

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

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

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

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

几何意义

对应矩阵M,其对应的线性变化
Mx=xMx = x'
上面这个式子,MxxMx,x'是一个向量,x,xx,x'可能是不共线的(如图(b)),如果向量Mx,xMx,x'满足Mx=x=λxMx=x'=\lambda x,则如图(b),这说明了这个变换就是对向量x做一个拉伸或者压缩。
SVD的讲解

如何实现通过Matlab、Python实现

数学推导:
Mx=λx Mx = \lambda x
Mxλx=(MλE)x=0 Mx-\lambda x=(M-\lambda E)x=0
齐次线性方程组有非零解,则MλE=0||M-\lambda 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,中文名字:奇异值分解

几何意义

图来源
以二维空间为例
SVD的讲解
SVD的讲解
几何意义就是把一个单位正交的网格,转换为另外一个单位正交的网格
假如选取了一组单位正交基{v1,v2\vec{v}_1,\vec{v}_2},刚好矩阵M的线性变化(Mv1M\vec{v}_1,Mv2M\vec{v}_2)也正交,用u1,u2\vec{u}_1,\vec{u}_2分别表示Mv1M\vec{v}_1,Mv2M\vec{v}_2的单位向量,用λ1,λ2\lambda_1,\lambda_2表示Mv1M\vec{v}_1,Mv2M\vec{v}_2的长度,描述网格在这些特定方向上的拉伸量,也被称作矩阵M的奇异值。
Mv1=λ1u1M\vec{v}_1 =\lambda_1\vec{u}_1
Mv2=λ2u2M\vec{v}_2 =\lambda_2\vec{u}_2
对任意给定的向量x\vec{x},则有
x=(v1x)v1+(v2x)v2 \mathbf{x}=\left(\mathbf{v}_{1} \cdot \mathbf{x}\right) \mathbf{v}_{1}+\left(\mathbf{v}_{2} \cdot \mathbf{x}\right) \mathbf{v}_{2}
再将M的线性变换
Mx=(v1x)MN1+(v2x)Mv2Mx=(v1x)σ1u1+(v2x)σ2u2 \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}
Mx=u1σ1v1x+u2σ2v2xM=u1σ1v1+u2σ2v2 \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}
so
M=UΣVT M=U \Sigma V^{T}

奇异值分解的推导过程

u=(u1,u2,...,um)u=(u_1,u_2,...,u_m)
v=(v1,v2,...,vn)v=(v_1,v_2,...,v_n)
u,vu,v都是空间的基,是正交矩阵 uTu=E,vTv=Eu^Tu=E,v^Tv = E
SVD的讲解
任何一个矩阵MmnM_{m*n}rank(M)=krank(M)=k,一定存在SVD,换句话说,M可以将一组单位正交基映射到另一组单位正交基。答案是肯定的
证明如下:
在n为空间中,有一组单位正交基{v1,v2,...,vn\vec{v}_1,\vec{v}_2,...,\vec{v}_n},线性变化作用以后
Mv1,Mv2,...,Mvn {M\vec{v}_1,M\vec{v}_2,...,M\vec{v}_n}
也是正交的,则有
(Mvi,Mvj)=(Mxi)TMvj=viTMTMvj=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
注意喔,MTMM^TM是矩阵喔,则会有MTMvj=λvjM^TM\vec{v}_j=\lambda \vec{v}_j
接下去,
viTMTMvj=viTλjvj=λjviTvj=λjviv˙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}
上述就证明了是有的:任何一个矩阵,都可以将一组单位正交基转换成另外一组正交基。
i=ji=j,<Mvi,Mvi>=λivivi=λi<M\vec{v}_i,M \vec{v}_i>=\lambda_i \vec{v}_i \vec{v}_i =\lambda_i
进行一些单位化,记ui=AviMvi=1λiMviu_i=\frac{A\vec{v}_i}{|M\vec{v}_i|}=\frac{1}{\sqrt{\lambda_i}}M\vec{v}_i

Avi=σiui,σi(奇异值)=λi,0ik,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})
k<i<=mk < i <= m时,对u1u2...uku1,u2,...,uk进行扩展u(k+1),...,umu(k+1),...,um,使得u1u2...umu1,u2,...,ummm维空间中的一组正交基.也可对v1,v2,...,vk\vec{v}_1,\vec{v}_2,...,\vec{v}_k进行扩展,扩展的vk+1,...,vn\vec{v}_{k+1},...,\vec{v}_{n}存在零子空间里面。
M[v1vkvk+1vm]=[u1TukTuk+1unT][σ100σk0000] M\left[ \begin{array}{lll}{\vec{v}_{1}} & {\cdots} & {\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} & & 0 & 0\\ & {\ddots} & \sigma_{k} & 0 \\ \hline 0 & & 0 &0\end{array}\right]
M=[u1uk][σ1σk][v1TvkT]+[uk+1um][0][vk+1TvnT] M=\left[ \begin{array}{lll}{\vec{u}_{1}} & {\cdots} & {\vec{u}_{k}}\end{array}\right] \left [ \begin{array}{ccc}\sigma_{1} & & \\ & {\ddots} & \\ & & {\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}} & {\cdots} & {\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]

SVD算例

U:AATAA^T的特征值和特征向量,用单位化的特征向量构成 U
V: ATAA^TA 的特征值和特征向量,用单位化的特征向量构成 V
$\sum_{mn} $ :将$ AA^{T} ATAΣ或者 A^{T}A 的特征值求平方根,然后构成 Σ 以矩阵A = \left[\begin{matrix} 1 & 1\1 &1\ 0 &0\\end{matrix} \right]$
第一步 U ,下面是一种计算方法
对矩阵AAT=[220220000] A A^{T}=\left[ \begin{array}{lll}{2} & {2} & {0} \\ {2} & {2} & {0} \\ {0} & {0} & {0}\end{array}\right] 特征分解,
特征是4,0,0
特征向量是$
\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}$,可得到
U=[1212012120001] U=\left[ \begin{array}{ccc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} & {0} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}} & {0} \\ {0} & {0} & {1}\end{array}\right]

第二步
计算矩阵ATAA^TA的特征分解,可得
特征值4,0,
V=[12121212] V=\left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}}\end{array}\right]
第三步
计算mn\sum_{mn}
Σ=[200000] \Sigma=\left[ \begin{array}{ll}{2} & {0} \\ {0} & {0} \\ {0} & {0}\end{array}\right]
最后,
A=UΣVT=[1212012120001][200000][12121212]T=[111100] A=U \Sigma V^{T}=\left[ \begin{array}{ccc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} & {0} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}} & {0} \\ {0} & {0} & {1}\end{array}\right] \left[ \begin{array}{ll}{2} & {0} \\ {0} & {0} \\ {0} & {0}\end{array}\right] \left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}}\end{array}\right]^{T}=\left[ \begin{array}{cc}{1} & {1} \\ {1} & {1} \\ {0} & {0}\end{array}\right]

如何通过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. 特征值分解只考虑了对矩阵缩放效果,奇异值分解对矩阵有选择、收缩、投影的效果
    SVD的讲解SVD的讲解SVD的讲解

相关文章: