矩陣分解是推薦系統的主流思想之一,它的思想是把矩陣拆解爲多個矩陣的乘積。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分解要求矩陣是稠密的,即矩陣都有元素,可是在實際業務過程當中矩陣每每是稀疏的,存在大量缺失值。
若是咱們要對缺失值進行補全,填充的方式通常簡單粗暴,從而形成數據的噪音大。