在上一篇 中,簡單介紹了熱度推薦、協同過濾、內容推薦的算法概述,此篇主要分享協同過濾算法中基於用戶的協同過濾算法Python實現。
基於用戶的協同過濾算法概述
可以簡單理解為"人以群分"的算法解釋,通過海量數據中人的歷史行為,計算人相互之間的相似度,然後將與你相似的人喜歡的物品推薦給你。
![頭條推薦算法——協同過濾、內容推薦算法介紹與Python實現(二)](http://p2.ttnews.xyz/loading.gif)
基於用戶的協同過濾
上圖示意出基於用戶的協同過濾推薦機制的基本原理,假設Charles 喜歡文章A/B,Mark喜歡文章A/B/C,Bill喜歡文章C;從這些用戶的歷史喜好記錄中,我們可以發現Charles 和Mark的偏好是比較相似的,同時Mark還喜歡文章C,那麼我們可以推斷Charles可能也喜歡文章C,因此可以將文章C推薦給Charles。
相似度的幾種度量方式
此篇中只應用相對常見的幾種相似度度量算法,如歐幾里得距離、皮爾遜相似度、餘弦相似度。
這幾種度量方法的區別可以看下我的另一篇文章 。
其中皮爾遜相似度可以簡單的看做是升級版本的歐幾里得度量算法,因為它提供了對於變量度量單位不同的處理步驟。因此對不同變量間的取值範圍沒有要求。是以擬合的方法來判斷兩個數據的相關性,和歐式方法相比更適合數據不是很規範的情況。
數據處理
![頭條推薦算法——協同過濾、內容推薦算法介紹與Python實現(二)](http://p2.ttnews.xyz/loading.gif)
歐幾里得距離
皮爾遜相似度
餘弦相似度
有興趣的可以瞭解下修正後的餘弦相似度計算方式,主要解決餘弦相似度僅考慮向量維度方向上的相似而沒考慮到各個維度的量綱的差異性,所以在計算相似度的時候,做了每個維度減去均值的修正操作。
基於用戶的協同過濾推薦算法實現步驟
- 格式化數據 獲取movies和ratings
- 轉換成數據userDict表示某個用戶的所有電影的評分集合,並對評分除以5進行歸一化
- 轉換成數據ItemUser表示某部電影參與評分的所有用戶集合
- 計算所有與userId有交集的用戶相似度
- 嘗試餘弦相似度度
- 皮爾遜相似度
- 歐幾里德距離
- 根據相似度生成推薦電影列表
- 計算推薦準確率
- 輸出推薦列表
基於用戶的協同過濾推薦的算法Python實現
初始化CollaborativeFitering類屬性
數據標準化處理
計算用戶相似度
獲取用戶推薦列表(包含自己已經看過的電影,此函數返回值用於計算準確率)
計算推薦準確率
獲取用戶推薦列表(不包含已經看的電影)
三種不同相似度的推薦準確率結果
隨機了幾個用戶 分別用三種相似度度量方式進行下推薦準確率測試,如下:
附測試數據下載地址,下載ml-1m.zip數據:http://grouplens.org/datasets/movielens/
後續文章中將詳細介紹基於物品協同過濾算法、內容推薦算法的python實現,感興趣的可以關注哦。
閱讀更多 測試開發技術棧 的文章