奇異值分解(singular value decomposition,以下簡稱svd)是在機器學習領域廣泛應用的演算法,它不光可以用於降維演算法中的特徵分解,還可以用於推薦系統,以及自然語言處理等領域。是很多機器學習演算法的基石.
svd也是對矩陣進行分解,但是和特徵分解不同,svd並不要求要分解的矩陣為方陣。假設我們的矩陣a是乙個m×n的矩陣,那麼我們定義矩陣a的svd為:
假設有 m×n的矩陣 a,那麼 svd 就是要找到如下式的這麼乙個分解,將 a 分解為 3 個矩陣的乘積:
其中u和v都是正交矩陣, 在複數域內的話就是酉矩陣(unitary matrix),即
換句話說,就是說u的轉置等於u的逆,v的轉置等於v的逆:
而 σ就是乙個非負實對角矩陣。
那麼 u和 v 以及σ是如何構成的呢?
u 和 v 的列分別叫做 a 的 左奇異向量(left-singular vectors)和 右奇異向量(right-singular vectors),σ 的對角線上的值叫做 a 的奇異值(singular values)。
其實整個求解 svd 的過程就是求解這 3 個矩陣的過程,而求解這 3 個矩陣的過程就是求解特徵值和特徵向量的過程,問題就在於求誰的特徵值和特徵向量。
u 的列由 a^t * a的單位化過的特徵向量構成
v 的列由 a^t * a的單位化過的特徵向量構成
σ 的對角元素**於 a^t * a或 a * a^t 的特徵值的平方根,並且是按從大到小的順序排列
知道了這些,那麼求解 svd 的步驟就顯而易見了:
求 a * a^t的特徵值和特徵向量,用單位化的特徵向量構成u
求 a * a^t的特徵值和特徵向量,用單位化的特徵向量構成v
將 a * at或者at * a的特徵值求平方根,然後構成 σ
假設
那麼可以計算得到
接下來就是求這個矩陣的特徵值和特徵向量了
要想該方程組有非零解(即非零特徵值),那麼係數矩陣 a * a ^ t − λe的行列式必須為 0
求解這個行列式我就不再贅述了,這個直接使用行列式展開定理就可以了,可以得到 λ1≈29.86606875,λ2≈0.13393125,λ3=λ4=0有 4 個特徵值,因為特徵多項式 ∣a*a^t−λe∣是乙個 4 次多項式。對應的單位化過的特徵向量為
這就是矩陣 u 了。
同樣的過程求解 at * a的特徵值和特徵向量,求得 λ1≈0.13393125,λ2≈29.86606875,將特徵值降序排列後對應的單位化過的特徵向量為
這就是矩陣 v 了。
而矩陣 σ 根據上面說的為特徵值的平方根構成的對角矩陣
到此,svd 分解就結束了,原來的矩陣 a 就被分解成了 3 個矩陣的乘積。
numpy 實現
python 中可以使用 numpy 包的 linalg.svd() 來求解 svd
import numpy as np
a = np.array([[
2,4]
,[1,
3],[
0,0]
,[0,
0]])
print
(np.linalg.svd(a)
)
(array([[
-0.81741556,-
0.57604844,0
.,0.
],[-
0.57604844
,0.81741556,0
.,0.
],[0
.,0.
,1.,
0.],
[0.,
0.,0
.,1.
]]),
array(
[5.4649857
,0.36596619])
, array([[
-0.40455358,-
0.9145143],
[-0.9145143
,0.40455358]]
))
奇異值分解 SVD
最近不小心接觸到了svd,然後認真看下去之後發現這東西真的挺強大的,把乙個推薦問題轉化為純數學矩陣問題,看了一些部落格,把乙個寫個比較具體的博文引入進來,給自己看的,所以把覺得沒必要的就去掉了,博文下面附原始部落格位址。一 基礎知識 1.矩陣的秩 矩陣的秩是矩陣中線性無關的行或列的個數 2.對角矩陣...
SVD奇異值分解
原文出處 今天我們來講講奇異值分解和它的一些有意思的應用。奇異值分解是乙個非常,非常,非常大的話題,它的英文是 singular value decomposition,一般簡稱為 svd。下面先給出它大概的意思 對於任意乙個 m n 的矩陣 m 不妨假設 m n 它可以被分解為 m udv t 其...
奇異值分解(SVD)
svd是singular value decomposition的縮寫,是去除冗餘 資訊提取和資料約簡的強大工具。若a為p q實數矩陣,則存在p階正交矩陣u和q階正交矩陣v,使得 a u v 上式就是奇異值分解,其中p q矩陣 中,i,i 元素 i 0,i 1,2,3,min p,q 其他元素均為0...