【矩陣分解二】FunkSVD

改進點(跟SVD比):

一句話總結改進點和優化點:改進SVD的計算效率問題、數據稀疏問題;將矩陣R分解爲兩個低維矩陣,通過重構的低維矩陣預測用戶對物品的評分,目標函數中加入正則,控制模型方差。


FunkSVD是在傳統SVD面臨計算效率問題時提出來的,既然將一個矩陣做SVD分解成3個矩陣很耗時,同時還面臨稀疏的問題,那麼我們能不能避開稀疏問題,同時只分解成兩個矩陣呢?也就是說,現在期望我們的矩陣R這樣進行分解:

這種簡化的矩陣分解不再是分解爲三個矩陣,而是分解爲兩個低秩的用戶和物品矩陣,其實就是把用戶和物品都映射到一個 k 維空間中,這個 k 維空間對應着 k 個隱因子,我們認爲用戶對物品的評分主要是由這些隱因子影響的,所以這些隱因子代表了用戶和物品一部分共有的特徵,在物品身上表現爲屬性特徵,在用戶身上表現爲偏好特徵。只不過這些隱因子並不具有實際意義,也不一定具有非常好的可解釋性,每一個維度也沒有確定的標籤名字,所以叫做 “隱因子”。

主要思想:

核心思想認爲用戶的興趣只受少數幾個因素的影響,因此將稀疏且高維的User-Item評分矩陣分解爲兩個低維矩陣,即通過User、Item評分信息來學習到的用戶特徵矩陣P和物品特徵矩陣Q,通過重構的低維矩陣預測用戶對產品的評分。由於用戶和物品的特徵向量維度比較低,因而可以通過梯度下降(Gradient Descend)的方法高效地求解。

目標函數

FunkSVD如何將矩陣R分解爲P和Q呢?這裏便用到了到了機器學習算法,實際上是應用線性迴歸的思想,我們的目標是讓用戶已有評分和用矩陣乘積得到的評分殘差儘可能的小,所以用均方差作爲損失函數,來尋找最終的 P 和 Q。即通過 User-Item 評分信息來學習到的用戶特徵矩陣 P 和物品特徵矩陣 Q,通過重構的低維矩陣預測用戶對物品的評分。

假設某一用戶 𝑢 對物品 𝑖 的評分爲 𝑟𝑢𝑖,經過矩陣分解投射到 𝑘 維空間的對應的用戶 𝑢 的隱含特徵向量爲 𝑝𝑢,對應的物品 𝑖 的隱含特徵向量爲 𝑞𝑖,兩個向量中的元素分別表示用戶 𝑢 和物品 𝑖 對各項隱因子的符合程度,有正向的也有反向的。可用兩個隱含特徵向量的點積來近似還原矩陣分解前的原始值,它表達了用戶 𝑢 對物品 𝑖 的總體興趣,表示爲:

將 𝑟𝑢𝑖 作爲真實評分,將 𝑟̂ 𝑢𝑖 作爲預測評分,針對所有已有評分的樣本,可得到目標函數:


其中,𝜅 是已有評分的用戶和物品對的樣本集,𝜆 是正則化係數,是一個超參數.其中P是用戶矩陣,Q是item矩陣。

公式中加號前一部分損失函數,控制着模型的偏差,即分解後的矩陣預測分數,要和實際的用戶評分之間誤差越小越好;加號後一部分是正則化項,控制着模型的方差,即得到的隱因子向量要越簡單越好,以免出現過擬合。

求解

梯度下降法求解參數:

將上式分別對 𝑝𝑢、𝑞𝑖 求導我們得到:

在梯度下降法迭代時,𝑝𝑢、𝑞𝑖 的迭代公式爲:

通過迭代我們最終可以得到 P 和 Q,進而用於推薦。FunkSVD 算法雖然思想很簡單,但在實際應用中效果非常好,這真是驗證了大道至簡。

其他:

Funk-SVD名字的由來:

Simon Funk在博客上公開發表了一個只考慮已有評分記錄的矩陣分解方法,稱爲Funk-SVD,也就是被Yehuda Koren稱爲隱語義模型的矩陣分解方法。

 

參考:

1.https://lumingdong.cn/recommendation-algorithm-based-on-matrix-decomposition.html

2.http://freewill.top/2017/03/07/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AE%97%E6%B3%95%E7%B3%BB%E5%88%97%EF%BC%8813%EF%BC%89%EF%BC%9A%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%EF%BC%883%EF%BC%89%E2%80%94%E2%80%94%E7%9F%A9%E9%98%B5%E5%88%86%E8%A7%A3%E6%8A%80%E6%9C%AF/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章