這里我想給大家介紹另外一種推薦系統,這種算法叫做潛在因子(Latent Factor)算法。這種算法是在NetFlix(沒錯,就是用大數據捧火《紙牌屋》的那家公司)的推薦算法競賽中獲獎的算法,最早被應用於電影推薦中。這種算法在實際應用中比現在排名第一的 @邰原朗 所介紹的算法誤差(RMSE)會小不少,效率更高。我下面僅利用基礎的矩陣知識來介紹下這種算法。
這種算法的思想是這樣:每個用戶(user)都有自己的偏好,比如A喜歡帶有小清新的、吉他伴奏的、王菲等元素(latent factor),如果一首歌(item)帶有這些元素,那么就將這首歌推薦給該用戶,也就是用元素去連接用戶和音樂。每個人對不同的元素偏好不同,而每首歌包含的元素也不一樣。我們希望能找到這樣兩個矩陣:
一.用戶-潛在因子矩陣Q,
表示不同的用戶對於不用元素的偏好程度,1代表很喜歡,0代表不喜歡。比如下面這樣:
二.潛在因子-音樂矩陣P
表示每種音樂含有各種元素的成分,比如下表中,音樂A是一個偏小清新的音樂,含有小清新這個Latent Factor的成分是0.9,重口味的成分是0.1,優雅的成分是0.2……
利用這兩個矩陣,我們能得出張三對音樂A的喜歡程度是:張三對小清新的偏好*音樂A含有小清新的成分+對重口味的偏好*音樂A含有重口味的成分+對優雅的偏好*音樂A含有優雅的成分+……
即:0.6*0.9+0.8*0.1+0.1*0.2+0.1*0.4+0.7*0=0.69
每個用戶對每首歌都這樣計算可以得到不同用戶對不同歌曲的評分矩陣。(注,這里的破浪線表示的是估計的評分,接下來我們還會用到不帶波浪線的R表示實際的評分):
因此我們隊張三推薦四首歌中得分最高的B,對李四推薦得分最高的C,王五推薦B。
如果用矩陣表示即為:
下面問題來了,這個潛在因子(latent factor)是怎么得到的呢?
由於面對海量的讓用戶自己給音樂分類並告訴我們自己的偏好系數顯然是不現實的,事實上我們能獲得的數據只有用戶行為數據。我們沿用 @邰原朗的量化標准:單曲循環=5, 分享=4, 收藏=3, 主動播放=2 , 聽完=1, 跳過=-2 , 拉黑=-5,在分析時能獲得的實際評分矩陣R,也就是輸入矩陣大概是這個樣子:
事實上這是個非常非常稀疏的矩陣,因為大部分用戶只聽過全部音樂中很少一部分。如何利用這個矩陣去找潛在因子呢?這里主要應用到的是矩陣的UV分解。也就是將上面的評分矩陣分解為兩個低維度的矩陣,用Q和P兩個矩陣的乘積去估計實際的評分矩陣,而且我們希望估計的評分矩陣
和實際的評分矩陣不要相差太多,也就是求解下面的目標函數:
這里涉及到最優化理論,在實際應用中,往往還要在后面加上2范數的罰項,然后利用梯度下降法就可以求得這P,Q兩個矩陣的估計值。這里我們就不展開說了。例如我們上面給出的那個例子可以分解成為這樣兩個矩陣: 這兩個矩陣相乘就可以得到估計的得分矩陣:
將用戶已經聽過的音樂剔除后,選擇分數最高音樂的推薦給用戶即可(紅體字)。
在這個例子里面用戶7和用戶8有強的相似性: 從推薦的結果來看,正好推薦的是對方評分較高的音樂: