目录 ??
1?? 简单说一下特征值, 特征向量与特征分解
?? I. 特征值, 特征向量与特征分解
?? II. 几何意义
?? III. 如何实现通过 Matlab,Python 实现
2?? 详细解说 SVD
?? I. 几何意义
?? I. 奇异值分解的推导过程
?? I. SVD 算例
?? I. 如何通过 Matlab 和 Python
3?? 应用举例
?? I. 特征值, 特征向量与特征分解
4?? 特征分解, 奇异值分解的区别
?? I. 特征分解, 奇异值分解的区别
简单说一下特征值, 特征向量与特征分解
特征值, 特征向量与特征分解
Theory:
对于一个正阵 \(M\), 满足如下:
\[Mx=\lambda x \]
其中 \(\lambda\)被成为特征值, 满足 \(||M-\lambda E||=0\)再有 \((M-\lambda E)x=0\), 可计算其特征向量.
如果有了特征值和特征向量后呢, 则可以将矩阵 \(M\)用特征分解:
\[ M=W\sum W^{-1}\]
\(W={w_1,w_2,...,w_n}\)分别是特征值 \(\lambda_1,\lambda_2,...,\lambda_n\)对应的特征向量构成的方阵
几何意义
对应矩阵 M, 其对应的线性变化
\[Mx = x'\]
上面这个式子,\(Mx,x'\)是一个向量,\(x,x'\)可能是不共线的 (如图(b)), 如果向量 \(Mx,x'\) 满足 \(Mx=x'=\lambda x\), 则如图(b), 这说明了这个变换就是对向量 x 做一个拉伸或者压缩.
如何实现通过 Matlab,Python 实现
数学推导:
- \[ Mx = \lambda x\]
- \[ Mx-\lambda x=(M-\lambda E)x=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, 中文名字: 奇异值分解
几何意义
图来源
以二维空间为例
几何意义就是把一个单位正交的网格, 转换为另外一个单位正交的网格
假如选取了一组单位正交基 {\(\vec{v}_1,\vec{v}_2\)}, 刚好矩阵 M 的线性变化(\(M\vec{v}_1\),\(M\vec{v}_2\)) 也正交, 用 \(\vec{u}_1,\vec{u}_2\)分别表示 \(M\vec{v}_1\),\(M\vec{v}_2\)的单位向量, 用 \(\lambda_1,\lambda_2\)表示 \(M\vec{v}_1\),\(M\vec{v}_2\)的长度, 描述网格在这些特定方向上的拉伸量, 也被称作矩阵 M 的奇异值.
- \(M\vec{
- v
- }_1 =\lambda_1\vec{
- u
- }_1\)
- \(M\vec{
- v
- }_2 =\lambda_2\vec{
- u
- }_2\)
对任意给定的向量 \(\vec{x}\), 则有
\[ \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 的线性变换
- \[ \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
- } \]
- \[ \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 \Sigma V^{
- T
- } \]
奇异值分解的推导过程
- \(u=(u_1,u_2,...,u_m)\)
- \(v=(v_1,v_2,...,v_n)\)
\(u,v\)都是空间的基, 是正交矩阵 \(u^Tu=E,v^Tv = E\)
任何一个矩阵 \(M_{m*n}\),\(rank(M)=k\), 一定存在SVD, 换句话说, M 可以将一组单位正交基映射到另一组单位正交基. 答案是肯定的
证明如下:
再 n 为空间中, 有一组单位正交基{\(\vec{v}_1,\vec{v}_2,...,\vec{v}_n\)}, 线性变化作用以后
\[ {M\vec{v}_1,M\vec{v}_2,...,M\vec{v}_n} \]
也是正交的, 则有
\[(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 \]
注意喔,\(M^TM\)是矩阵喔, 则会有 \(M^TM\vec{v}_j=\lambda \vec{v}_j\)
接下去,
\[ \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=j\),\(<M\vec{v}_i,M \vec{v}_i>=\lambda_i \vec{v}_i \vec{v}_i =\lambda_i\)
进行一些单位化, 记 \(u_i=\frac{A\vec{v}_i}{|M\vec{v}_i|}=\frac{1}{\sqrt{\lambda_i}}M\vec{v}_i\)
则
\[ 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 <= m\)时, 对 \(u1,u2,...,uk\)进行扩展 \(u(k+1),...,um\), 使得 \(u1,u2,...,um\)为 \(m\)维空间中的一组正交基. 也可对 \(\vec{v}_1,\vec{v}_2,...,\vec{v}_k\)进行扩展, 扩展的 \(\vec{v}_{k+1},...,\vec{v}_{n}\)存在零子空间里面.
- \[ 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=\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:\(AA^T\)的特征值和特征向量, 用单位化的特征向量构成 U
V: \(A^TA\) 的特征值和特征向量, 用单位化的特征向量构成 V
$\sum_{mn} $ : 将 $ AA^{T} \(或者 A^{T}A 的特征值求平方根, 然后构成 Σ 以矩阵 \)A = \left[\begin{matrix} 1 & 1\1 &1\ 0 &0\\end{matrix} \right]$
第一步 U , 下面是一种计算方法
对矩阵 \[ 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=\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] \]
第二步
计算矩阵 \(A^TA\)的特征分解, 可得
特征值 4,0,
\[ V=\left[ \begin{array}{cc}{\frac{1}{\sqrt{2}}} & {-\frac{1}{\sqrt{2}}} \\ {\frac{1}{\sqrt{2}}} & {\frac{1}{\sqrt{2}}}\end{array}\right] \]
第三步
计算 \(\sum_{mn}\)
\[ \Sigma=\left[ \begin{array}{ll}{2} & {0} \\ {0} & {0} \\ {0} & {0}\end{array}\right] \]
最后,
\[ 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 图像压缩
特征值分解和奇异值分解的区别
特征值分解只能是方阵, 而奇异值分解是矩阵就可以
特征值分解只考虑了对矩阵缩放效果, 奇异值分解对矩阵有选择, 收缩, 投影的效果
来源: http://www.bubuko.com/infodetail-2973324.html