【MF】SVD

矩陣分解是推薦系統的主流思想之一,它的思想是把矩陣拆解爲多個矩陣的乘積。spa

 

矩陣分解有倆種方法,分別是 EVD(特徵值分解) 和 SVD(奇異值分解),在推薦系統中許多矩陣是非對稱的,並且不是方陣,因此一般在應用過程當中採用SVD。code

如圖所示,咱們能夠認爲A是uer/iterm矩陣,經過矩陣分解,咱們能夠得出User矩陣和Iterm矩陣。以及中間的元素是特徵向量的對角矩陣。blog

 代碼如圖所示:ip

#EVD
import
numpy as np A = np.array([[5,3], [1,1]]) lamda, U = np.linalg.eig(A) print('矩陣A: ') print(A) print('特徵值: ',lamda) print('特徵向量') print(U)
#SVD
from scipy.linalg import svd
import numpy as np
from scipy.linalg import svd
A = np.array([[1,2],
        [1,1],
        [0,0]])
p,s,q = svd(A,full_matrices=False)
print('P=', p)
print('S=', s)
print('Q=', q)

這麼一倒騰,感受也沒什麼做用。可是經過矩陣分解,咱們可使用較少特徵值對矩陣A進行近似還原。內存

如圖,若是咱們想看user2對iterm3的評分,能夠獲得:ci

4=-0.46*16.47*(-0.29)+(-0.30)*6.21*(-0.38)+(-0.65)*4.40*(-0.13)+0.28*2.90*0.87+0.02*1.58*(-0.03)it

 

事實上,咱們發現user的最後一列是沒有用到的,咱們能夠把沒有用到的行列拋掉,從而實現了數據的降維。甚至咱們還可使用更少的特徵,去獲得A的近似解。class

 

 

 

傳統的SVD在推薦系統中的應用以下:import

使用K的個特徵向量對矩陣降維並行

從而將第i個用戶對第j個物品的評分轉化爲行列式的求值,不只能夠進行並行計算,還節省了內存。

一般,完整的SVD能夠將M無損的分解成三個矩陣,可是爲了簡化矩陣分解,還可使用較少的K對矩陣A進行近似還原。

 

存在的使用侷限:

SVD分解要求矩陣是稠密的,即矩陣都有元素,可是在實際業務過程當中矩陣每每是稀疏的,存在大量缺失值。

若是咱們要對缺失值進行補全,填充的方式通常簡單粗暴,從而形成數據的噪音大。

相關文章
相關標籤/搜索