機(jī)器學(xué)習(xí)基礎(chǔ):奇異值分解(SVD)

SVD 原理

奇異值分解(Singular Value Decomposition)是線性代數(shù)中一種重要的矩陣分解,也是在機(jī)器學(xué)習(xí)領(lǐng)域廣泛應(yīng)用的算法,它不光可以用于降維算法中的特征分解,還可以用于推薦系統(tǒng),以及自然語言處理等領(lǐng)域。

有一個(gè)??×??的實(shí)數(shù)矩陣??,我們想要把它分解成如下的形式:A = U\Sigma V^T

[圖片上傳失敗...(image-a21214-1650075145167)]

其中??和??均為單位正交陣,即有????^??=??????^??=??,??稱為左奇異矩陣,??稱為右奇異矩陣,Σ僅在主對(duì)角線上有值,我們稱它為奇異值,其它元素均為0。

上面矩陣的維度分別為U \in R^{m\times m},\ \Sigma \in R^{m\times n},\ V \in R^{n\times n}

[圖片上傳失敗...(image-7f20f7-1650075145167)]

一般地Σ有如下形式
\Sigma = \left[ \begin{matrix} \sigma_1 & 0 & 0 & 0 & 0\\ 0 & \sigma_2 & 0 & 0 & 0\\ 0 & 0 & \ddots & 0 & 0\\ 0 & 0 & 0 & \ddots & 0\\ \end{matrix} \right]_{m\times n}

??_?? 越大意味著對(duì)應(yīng)的 ??′?? 的特征值 \sigma_j^2 越大, 從而其主成分 (principal component) ????_?? 的樣本方差越大, 我們把方差大視為提供了更多信息.

求解U, Σ, V

假設(shè)我們的矩陣A是一個(gè)m×n的矩陣,則A^TA是方陣,求其特征值及特征向量:

(A^TA)v_i = \lambda_i v_i

得到矩陣A^TA的n個(gè)特征值和對(duì)應(yīng)的n個(gè)特征向量v


A^TA=V\Sigma^TU^TU\Sigma V^T =V\Sigma^T\Sigma V^T= V\Sigma^2V^T

將特征向量v張成一個(gè)n×n的矩陣V,就是SVD公式里面的V矩陣,V中的每個(gè)特征向量叫做A的右奇異向量。

同理:(AA^T)u_i = \lambda_i u_i,可得U矩陣。

求得U , V,然后求Σ,因Σ為奇異值矩陣,所以只需要求出每個(gè)奇異值σ即可。

A=U\Sigma V^T \Rightarrow AV=U\Sigma V^TV \Rightarrow

AV=U\Sigma \Rightarrow Av_i = \sigma_i u_i \Rightarrow \sigma_i=Av_i / u_i

其實(shí)特征值矩陣等于奇異值矩陣的平方,也就是說特征值和奇異值滿足如下關(guān)系:

\sigma_i = \sqrt{\lambda_i}

所以不用\sigma_i = Av_i / u_i也可以通過求出A^TA的特征值取平方根來求奇異值。

SVD算法


輸入:樣本數(shù)據(jù)
輸出:左奇異矩陣,奇異值矩陣,右奇異矩陣

1 計(jì)算特征值: 特征值分解AA^T,其中A \in \mathbf{R}^{m\times n}為原始樣本數(shù)據(jù)
AA^T=U\Sigma \Sigma^TU^T

得到左奇異矩陣U \in \mathbf{R}^{m \times m}和奇異值矩陣\Sigma' \in \mathbf{R}^{m \times m}

2 間接求部分右奇異矩陣: 求V' \in \mathbf{R}^{m \times n}

利用A=UΣ′V′可得

V' = (U\Sigma')^{-1}A = (\Sigma')^{-1}U^TA

3 返回U, Σ′, V′,分別為左奇異矩陣,奇異值矩陣,右奇異矩陣。


Python 求解SVD

from numpy import array
from numpy import diag
from numpy import zeros
from scipy.linalg import svd
# define a matrix
A = array([
    [1,2,3,4,5,6,7,8,9,10],
    [11,12,13,14,15,16,17,18,19,20],
    [21,22,23,24,25,26,27,28,29,30]])
print(A)
>>> A
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]])
# Singular-value decomposition
U, s, VT = svd(A)
# create m x n Sigma matrix
Sigma = zeros((A.shape[0], A.shape[1]))
# populate Sigma with n x n diagonal matrix
Sigma[:A.shape[0], :A.shape[0]] = diag(s)
# select
n_elements = 2
Sigma = Sigma[:, :n_elements]
VT = VT[:n_elements, :]
# reconstruct
B = U.dot(Sigma.dot(VT))
print(B)
>>> B
array([[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],
       [11., 12., 13., 14., 15., 16., 17., 18., 19., 20.],
       [21., 22., 23., 24., 25., 26., 27., 28., 29., 30.]])
# transform
T = U.dot(Sigma)
print(T)
>>> T
array([[-18.52157747,   6.47697214],
       [-49.81310011,   1.91182038],
       [-81.10462276,  -2.65333138]])
T = A.dot(VT.T)
print(T)
[[-18.52157747   6.47697214]
 [-49.81310011   1.91182038]
 [-81.10462276  -2.65333138]]

參考:
https://www.cnblogs.com/pinard/p/6251584.html
https://www.cnblogs.com/endlesscoding/p/10033527.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容