標籤:12c pwm omr master abi oci bmc mtd cnn
在新手接觸推薦系統這個領域時,遇到第一個理解起來比較困難的就是協同過濾法。那麼如果這時候百度的話,得到最多的是奇異值分解法,即(SVD)。SVD的作用大致是將一個矩陣分解為三個矩陣相乘的形式。如果運用在推薦系統中,首先我們將我們的訓練集表示成矩陣的形式,這裡我們以movielen資料集為例。這個資料集包含了使用者對電影的評分。那麼矩陣形式大致為:
| |
movie1 |
movie2 |
movie3 |
moive4 |
| user1 |
1 |
|
|
|
| user2 |
2 |
|
|
3 |
| user3 |
|
5 |
4 |
|
| user4 |
2 |
|
|
4 |
其中1~5就是對應使用者對電影的評分。空餘處表示資料集中沒有對應使用者和電影的資訊。如果我們想使用SVD,一般講空餘處都填為0.假設此矩陣為V.那麼運用SVD可以得到
V = UΣVT
但是上面的等號並不能取到,只能是約等於。那麼我們將得到的三個矩陣相乘得到V‘(注意與V不同)。那麼原來的空白處(也就是0處)可能就不再為0,那麼這就是對該user-moive對的預測。這就是SVD的主要原理。因為SVD有很多現成的演算法,也不用迭代就可直接得到,所以使用比較方便。
但是我們會看到,上面方法有一個致命的缺陷,那就是將未知的評分全都設為0.這其實是極其不合理的,因為使用者不給某個電影打分並不是很不喜歡(0分),而是有可能還沒有看過這個電影。這樣就加入了我們主觀臆斷的資訊,最後造成錯誤。解決的方法就是使用隱因子的矩陣分解法。注意矩陣分解法和SVD有相似的地方也有不同的地方,下面我就對矩陣分解法進行詳細介紹。
在矩陣分解法中,有一個假設,就是每一個使用者都有一個長度為k的特徵向量,每一部電影也有一個相同長度的特徵向量(k一般需要使用者指定)。那麼所有使用者的特徵向量排列成一個矩陣 U 的維度為UserNum * k。其中使用者i對應的向量為Ui。所有電影的特徵向量排列成一個矩陣M 的維度為MoiveNum * k。其中電影j對應的向量為Uj。那麼使用者i對電影j的評分 Vij = <Ui , Mj>(<>代表點乘)。那麼所有使用者和所有電影之間的評分就可以用兩個矩陣相乘來得到:
V‘ = UMT
注意這裡是V‘而不是V。那麼問題來了,我們如何確定這個U和M?一個自然的想法就是讓V‘和V儘可能地相等。那麼這又有一個問題,那就是V(即資料集)有很多地方是沒有評分的,如何判斷和V‘是否相等?那麼我們在這裡只計算有評分處的MSE。這樣既沒有使用額外的資訊,又能判斷兩者是否接近。那麼自然而然得就引入了我們的lost function:
這裡Iij表示使用者i對電影j有評分記錄。後面兩項是懲罰因子,目的是防止過擬合。那麼利用梯度下降法,我們就可以通過迭代得到U和M的值。其對U和對M的求到如下:
到這裡我們就已經完成了基礎的矩陣分解法。那麼進一步,為了實現更好的效果,我們要考慮每個個體打分的影響,因為有些使用者打分偏高,有些使用者打分偏低。同樣對於電影和所有的評分。所以我們評分的計算公式應該改為:
Vij = <Ui,Mj> + overall_mean + ai +bj
其中overall_mean是所有評分的平均值,ai是使用者i打分的平均值,bj是電影j得分的平均值。其中overall_mean認為是一個常數,而ai和bj都是需要最佳化的參數。這裡我們就不給出對他們求導的式子,我直接給出矩陣形式的演算法,便於大傢具體實現。(INCOMING)
我自己寫了一個python版的,有興趣可以參考 https://github.com/ccienfall/RecommandSystem/blob/master/script/Factorize.py
參考文獻:《A Guide to Singular Value Decomp osition for Collaborative Filtering》
推薦系統——隱因子的矩陣分解法