參考自:http://blog.csdn.net/wjmishuai/article/details/71191945html
http://www.cnblogs.com/Xnice/p/4522671.html算法
基於潛在(隱藏)因子的推薦,常採用SVD或改進的SVD++函數
奇異值分解(SVD):優化
考慮CF中最爲常見的用戶給電影評分的場景,咱們須要一個數學模型來模擬用戶給電影打分的場景,好比對評分進行預測。ui
將評分矩陣U看做是兩個矩陣的乘積:spa
其中,uxy 能夠看做是user x對電影的隱藏特質y的熱衷程度,而iyz能夠看做是特質 y 在電影 z中的體現程度。那麼上述模型的評分預測公式爲:.net
q 和 p 分別對應了電影和用戶在各個隱藏特質上的特徵向量。htm
以上的模型中,用戶和電影都體現得無差異,例如某些用戶很是挑剔,老是給予很低的評分;或是某部電影拍得奇爛,惡評如潮。爲了模擬以上的狀況,須要引入 baseline predictor.blog
其中 μ 爲全部評分基準,bi 爲電影 i 的評分均值相對μ的偏移,bu 相似。注意,這些均爲參數,須要經過訓練獲得具體數值,不過能夠用相應的均值做爲初始化時的估計。ip
模型參數bi,bu,qi,pu經過最優化下面這個目標函數得到:
能夠用梯度降低方法或迭代的最小二乘算法求解。在迭代最小二乘算法中,首先固定pu優化qi,而後固定qi優化pu,交替更新。梯度降低方法中參數的更新式子以下(爲了簡便,把目標函數中的μ+bi+bu+q⊤ipu總體替換爲r^ui):
其中α是更新步長。
SVD++:
某個用戶對某個電影進行了評分,那麼說明他看過這部電影,那麼這樣的行爲事實上蘊含了必定的信息,所以咱們能夠這樣來理解問題:評分的行爲從側面反映了用戶的喜愛,能夠將這樣的反映經過隱式參數的形式體如今模型中,從而獲得一個更爲精細的模型,即是 SVD++.
其中 I(u) 爲該用戶所評價過的全部電影的集合,yj爲隱藏的「評價了電影 j」反映出的我的喜愛偏置。收縮因子取集合大小的根號是一個經驗公式,並無理論依據。
模型參數bi,bu,qi,pu,yj經過最優化下面這個目標函數得到:
與SVD方法相似,能夠經過梯度降低算法進行求解。
使用用戶的歷史評價數據做爲隱式反饋,算法流程圖以下: