1.背景知識
在講SVD++之前,我還是想先回到基於物品相似的協同過濾算法。這個算法基本思想是找出一個用戶有過正反饋的物品的相似的物品來給其作為推薦。其公式為:
其中 rui 表示預測用戶u對物品i的喜愛程度。wij 是物品i,j之間的相似度,N(u)代表用戶曾經有過正反饋的物品的集合。
就比如說我們現在有三個用戶A,B和C,還有四本書:《紅樓夢》,《史記》,《微積分導論》和《時間簡史》。用戶和書籍之間的閱讀關系為:
A | B | C | |
紅樓夢 | 1 | 1 | |
史記 | |||
微積分導論 | 1 | ||
線性代數 | 1 |
其中沒有標注1的即表示用戶沒有閱讀過此書籍。
那么我們首先需要一種相似度度量方法可以測得任意兩本書之間的相似度,暫時我們認為方法已經有了,並且已經把書籍兩兩之間的相似度計算出來了,其可以用一個對稱方陣W表示(在我們這個例子中是4X4的矩陣)。其具體值假設如下:
紅樓夢 | 史記 | 微積分導論 | 線性代數 | |
紅樓夢 | 1 | 0.7 | 0.2 | 0.1 |
史記 | 0.7 | 1 | 0.2 | 0.2 |
微積分導論 | 0.2 | 0.2 | 1 | 0.8 |
線性代數 | 0.1 | 0.2 | 0.8 | 1 |
那根據公式,我們計算用戶C對史記的喜歡程度就是 : ( 0.7 + 0.2)/ sqrt(2) 。
2. SVD++ 原理
上面的方法有一個問題,就是相似度度量方法我們不太容易得到,也就是我們沒法得到W這個矩陣。有一個想法就是我通過迭代優化的方法直接去計算整個W,其優化的lost function如下:
這樣的話就再不需要我們認為去定義一個相似度度量方法。但是一個新的問題又出現了。由於一般推薦系統中物品的個數往往都很多,所以W會是一個非常大的矩陣,那么這樣會給存儲和計算帶來很大的麻煩。這里我們把條件放寬一點,假設W是由兩個矩陣X和Y點乘得到的(其實就是矩陣分解)。那么預測的公式就變成了:
其中Xi 和Yj 是矩陣X和Y中第i行和第j行。
那么到此為止,我們用了迭代和矩陣分解的方法來處理相似度的信息,那么我們將這個相似度影響因素加入我們之前講的隱因子的矩陣分解方法中去,就得到:
可以看到,這個公式其實就是在隱因子的基礎上多加了一項。
但是,牛逼的dalao們又發現,如果讓矩陣P(這個是用戶的隱參數矩陣)和上面提到的W分解得到的X矩陣相等,可以防止模型過擬合,那么公式又變為:
這個公式有點錯誤,其括號中的xi 應該是沒有的。(太懶了,直接截圖過來不想改==)
3.算法實現
(INCOMING)
https://github.com/ccienfall/RecommandSystem/blob/master/script/Factorize.py 先拿代碼湊合着看吧。。。。
挖好坑,以后來填。(10.21)
前來填坑(11.2)