天天看點

奇異值分解SVD

矩陣分解在機器學習領域有着廣泛應用,是降維相關算法的基本組成部分。常見的矩陣分解方式有以下兩種

1. 特征分解Eigendecomposition, 也叫作譜分解Spectral decomposition

2. 奇異值分解Singular Value decompositon

特征分解建立在特征值和特征向量的基礎上,适合行列數目相等的方陣,其分解的結果如下

奇異值分解SVD

将一個方陣A, 拆分成3個矩陣的乘積,其中Q是矩陣A的特征向量構成的矩陣,∧是對角線為特征值的方陣,最後一個為Q的逆矩陣。下面通過numpy來驗證下特征分解的過程

>>> import numpy as np
>>> A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 原始方陣A
>>> A
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> eigenvalues, eigenvectors = np.linalg.eig(A)
# 特征值
>>> eigenvalues
array([ 1.61168440e+01, -1.11684397e+00, -1.30367773e-15])
# 特征向量
>>> eigenvectors
array([[-0.23197069, -0.78583024, 0.40824829],
       [-0.52532209, -0.08675134, -0.81649658],
       [-0.8186735 , 0.61232756, 0.40824829]])
# 對角線為特征值的矩陣
>>> np.diag(eigenvalues)
array([[ 1.61168440e+01, 0.00000000e+00, 0.00000000e+00],
       [ 0.00000000e+00, -1.11684397e+00, 0.00000000e+00],
       [ 0.00000000e+00, 0.00000000e+00, -1.30367773e-15]])
# 特征向量矩陣的逆矩陣
>>> np.linalg.inv(eigenvectors)
array([[-0.48295226, -0.59340999, -0.70386772],
       [-0.91788599, -0.24901003, 0.41986593],
       [ 0.40824829, -0.81649658, 0.40824829]])
# 三個矩陣的乘積是原始方陣A
>>> eigenvectors.dot(np.diag(eigenvalues)).dot(np.linalg.inv(eigenvectors))
array([[1., 2., 3.],
       [4., 5., 6.],
       [7., 8., 9.]])      

特征分解求解友善,但是隻适用于方陣。當矩陣的行數和列數不相等時,就隻能采用奇異值分解了。SVD也是同樣将矩陣拆分成3個子矩陣的乘積,圖示如下

奇異值分解SVD

對于m行n列的矩陣A, 通過SVD分解之後,拆分成了3個子矩陣,其中U矩陣為m行m列的方陣,V為n行n列的方陣,∑為隻有對角線有值的矩陣,其中的值稱之為奇異值。

看一個維基百科的例子,原始矩陣如下

奇異值分解SVD

奇異值分解的結果如下

奇異值分解SVD

對于矩陣U和V而言,其乘以對應的轉置矩陣,都會得到一個機關矩陣,這樣的矩陣稱之為酉矩陣

奇異值分解SVD

在奇異值分解中,矩陣的奇異值是按照從大到小的順序排列的,而且減少的特别快,經常前10%的奇異值就占據了全部奇異值99%以上的比例。基于這個性質,我們可以隻提取前幾個奇異值及其對應的矩陣來近似的描述原來的矩陣,圖示如下

奇異值分解SVD

這個性質和PCA算法完美契合,是以在scikit-learn的PCA求解中,就是通過SVD分解來求取最大的K個特征。

·end·

一個隻分享幹貨的

繼續閱讀