歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~git
協同過濾算法是推薦系統最經常使用的算法之一,本文將介紹一種方法來使它能夠在大型數據集上快速訓練。
協同過濾算法(CF)是構建推薦系統時最經常使用的技術之一。它能夠基於收集到的其餘用戶的偏好信息(協同)來自動地預測當前用戶的興趣點。協同過濾算法主要分爲兩種:基於記憶(memory-based)的協同過濾算法和基於模型(model-based)的協同過濾算法。通常來講,將二者融合能夠得到預測準確度上的提高。github
在本文中,咱們將關注基於記憶的協同過濾算法並詳細討論其推導和集成的細節。咱們將展現咱們最近在改進經典協同過濾算法上的一些工做,使其能夠在大規模數據集上實施並達到縮短訓練時間的效果。咱們的算法是用R語言實現的,可是它也能夠被移植到其餘語言上。算法
基於記憶的協同算法又能夠分爲下面兩種:編程
下面讓咱們從一個例子出發來觀察基於用戶的協同過濾是如何實現的。下面給出了計算評價ru,i的公式,ru,i 即用戶u對物品i的評分。咱們把和用戶u類似的用戶(用戶之間的類似度信息經過一個矩陣維護,sim爲類似度計算函數)的評價彙總在一塊兒,從公式能夠看出,用戶間的類似度越大,其中一個用戶對另外一個用戶評價的預測結果影響程度就越大。w爲計算最終評分所需的歸一化權重因子。數據結構
爲了驗證當前推薦系統的性能,咱們須要在測試集上進行預測。爲了更高的效率,計算會藉助矩陣乘法完成,而不是經過循環的方式完成。下面的圖片展現了矩陣計算的過程:框架
從左到右依次爲 用戶對物品的評分矩陣 用戶類似度矩陣 預測結果矩陣編程語言
上圖展現了預測用戶U2對物品I3評分時的計算過程。爲了計算預測結果,咱們須要知道其餘用戶對I3的評分(第一個矩陣中藍色高亮的一行)以及其餘用戶與U2的類似度(第二個矩陣中藍色高亮的一列;注意這裏我經過設置類似度矩陣對角線的元素爲零來避免數據泄露)。到此,咱們能夠寫出用戶U2對物品I3評分的計算公式:分佈式
計算結果將被存儲在第三個矩陣的藍色單元當中。不過這裏尚未進行歸一化,爲了獲得最終的預測結果,咱們還須要計算歸一化因子w,計算公式已經在上面給出。函數
基於記憶的協同過濾的主要優勢與它的可擴展性和性能密不可分。舉例來講,若是這裏有500,000個用戶,那麼咱們須要計算全部用戶對之間的類似度(最壞的狀況須要計算1200億個值)。顯然這須要大量的內存和處理時間,下面咱們將嘗試用R語言(固然你也可使用別的編程語言 : ) )對協同過濾算法進行一些改進從而解決這一問題。性能
咱們將用R推薦系統中最經常使用的包之一——recommenderlab與咱們的實現進行比較。這個比較是在4核i7,16G內存的小型電腦上完成的,使用的數據集是MovieLens 100k, MovieLens 1m, MovieLens 10m。後面,你會看到咱們的集成具備兩大優點:
評分矩陣一般是一個龐大(有大量的用戶和物品)的稀疏(每一個用戶每每只對少許的物品打分)矩陣。在R語言中,咱們能夠經過專門的數據結構來存儲稀疏矩陣,缺失值不會被重複存儲在內存當中。通常來講,有超過90%的值是缺失的,因此這種作法能夠節省下大量的內存。咱們的實現以及recommenderlab中都採用了矩陣的稀疏表示。
咱們實現的基於用戶的協同過濾主要包含如下步驟(基於物品的協同過濾也是如此):
recommenderlab也使用了與上面相同的過程。可是咱們在這些過程當中引入了一些改進從而顯著地提高了算法執行效率。其中主要的兩個優化以下:
咱們經過如下步驟來說咱們的實現與recommenderlab進行比較:
該數據集包括943個用戶和1682個電影(物品),100,000個評分。
基於用戶的協同過濾
基於物品的協同過濾
該數據集包括6040個用戶和3706個電影(物品),100,000個評分。
基於用戶的協同過濾
基於物品的協同過濾
能夠看到咱們的實如今運行速度上更快,精準度也更高(達到了更低的rmse)。其中咱們最關注的方面——速度獲得了顯著的提高。
然而,速度只是經典實現中問題的一個方面。咱們在上面提到過,協同過濾的另外一個問題是空間佔用,即當矩陣過於龐大時咱們會面臨內存不足的問題。在下一節中,咱們將提出一個可行的方案來使傳統的協同過濾算法能夠被應用在龐大的數據集上。
在下面的測試中,咱們使用MovieLens 10m的數據集。可是正如上面提到的,咱們測試的機器只有16GB的內存而且使用了十折的交叉驗證。'recommenderlab'的實如今創建用戶類似度矩陣的過程當中就由於內存不足而退出了。
在咱們的實現當中,咱們經過對矩陣進行切分解決了這一問題。即咱們不是一次性計算全部的預測值,而是一塊一塊完成的。下面給出基於用戶的協同過濾的實現過程(基於物品的協同過濾同理):
該數據集包括69,878個用戶和10,677個電影(物品),10,000,054個評分。咱們經過如下步驟來檢驗咱們的算法:
比較的結果能夠從下面的表格找到,包含:
基於物品的協同過濾
基於用戶的協同過濾
正如上圖展現的結果所示,咱們實現的算法完滿地完成了任務。如今咱們能夠在16Gb內存配置的機器上構建推薦系統了。基於用戶和基於物品的協同過濾分別耗費了10分鐘和200分鐘的時間,基於用戶的協同過濾花費了更多的時間是由於數據集中有了更多的用戶,這要求咱們計算更多的類似度。
經過如今的實現,當咱們須要爲一個或者多個用戶提供實時的推薦時,類似度的計算以及結果的預測將迅速不少,由於咱們能夠只選取少部分用戶進行操做。在MovieLens 10m的數據集上,基於用戶的協同過濾只須要一秒就能夠對一個用戶或者多個用戶生成預測,可是基於物品的協同過濾則須要30s左右,這是由於咱們須要更多的時間來計算類似度矩陣。這裏還能夠經過將類似度矩陣存儲爲模型,再也不進行即時的訓練從而達到線上預測效果的加速。這個算法實現的一個顯著優勢就是可擴展性,因爲咱們將原數據集切分爲了避免同塊進行計算,因此能夠進一步實現並行化。咱們接下來的工做之一就是在分佈式框架上實現並測試這一方法。
在本文中,咱們提出了一種新的方法來改進基於記憶的傳統協同過濾實現。本文的代碼能夠從Github上獲取。
問答
如何從源安裝R語言包?
相關閱讀
用R解析Mahout用戶推薦協同過濾算法(UserCF)
近鄰推薦之基於用戶的協同過濾
協同過濾原理及Python實現
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/dev...