參考自:http://blog.csdn.net/wjmishuai/article/details/71191945
http://www.cnblogs.com/Xnice/p/4522671.html
基於潛在(隱藏)因子的推薦,常采用SVD或改進的SVD++
奇異值分解(SVD):
考慮CF中最為常見的用戶給電影評分的場景,我們需要一個數學模型來模擬用戶給電影打分的場景,比如對評分進行預測。
將評分矩陣U看作是兩個矩陣的乘積:
其中,uxy 可以看作是user x對電影的隱藏特質y的熱衷程度,而iyz可以看作是特質 y 在電影 z中的體現程度。那么上述模型的評分預測公式為:
q 和 p 分別對應了電影和用戶在各個隱藏特質上的特征向量。
以上的模型中,用戶和電影都體現得無差別,例如某些用戶非常挑剔,總是給予很低的評分;或是某部電影拍得奇爛,惡評如潮。為了模擬以上的情況,需要引入 baseline predictor.
其中 μ 為所有評分基准,bi 為電影 i 的評分均值相對μ的偏移,bu 類似。注意,這些均為參數,需要通過訓練得到具體數值,不過可以用相應的均值作為初始化時的估計。
模型參數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方法類似,可以通過梯度下降算法進行求解。
使用用戶的歷史評價數據作為隱式反饋,算法流程圖如下: