SVD的基礎詳解

目錄 😄

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 圖像壓縮

特徵值分解和奇異值分解的區別

  1. 特徵值分解只能是方陣,而奇異值分解是矩陣就可以
  2. 特徵值分解只考慮了對矩陣縮放效果,奇異值分解對矩陣有選擇、收縮、投影的效果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章