尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
提到ALS相信大家應該都不會覺得陌生,它是協同過濾的一種,並被集成到Spark的Mllib庫中。本文就ALS的基本原理進行講解,並手把手、肩並肩地帶您做到這一算法。
完整做到代碼請參考:
1. 原理篇
我們用人話而不是大段的數學公式來講講ALS是怎麼一回事。
1.1 你聽說過推薦算法麼
假如我是豆瓣的CEO,很多豆瓣的用戶在豆瓣電影上都會對電影進行評分。那麼根據這個評分數據,我們有可能知道這些用戶除了自己評過分的電影之外還喜歡或討厭哪些電影嗎?這就是一個典型的推薦問題,解決這一類問題的算法被稱為推薦算法。
1.2 什麼是協同過濾
協同過濾的英文全稱是Collaborative Filtering,簡稱CF。注意,這不是一款遊戲!從字面上分析,協同就是尋找共同點,過濾就是篩選出優質的內容。
1.3 協同過濾的分類
一般來說,協同過濾推薦分為三種類型:
1. 基於用戶(user-based)的協同過濾,通過計算用戶和用戶的相似度找到跟用戶A相似的用戶B, C, D…再把這些用戶喜歡的內容推薦給A;
2.基於物品(item-based)的協同過濾,通過計算物品和物品的相似度找到跟物品1相似的物品2, 3, 4…再把這些物品推薦給看過物品1的用戶們;
3. 基於模型(model based)的協同過濾。主流的方法可以分為:矩陣分解,關聯算法,聚類算法,分類算法,回歸算法,神經網路。
1.4 矩陣分解
矩陣分解 (decomposition, factorization)是將矩陣拆解為數個矩陣的乘積。比如豆瓣電影有m個用戶,n個電影。那麼用戶對電影的評分可以形成一個m行n列的矩陣R,我們可以找到一個m行k列的矩陣U,和一個k行n列的矩陣I,通過U * I來得到矩陣R。
1.5 ALS
如果想通過矩陣分解的方法做到基於模型的協同過濾,ALS是一個不錯的選擇,其英文全稱是Alternating Least Square,翻譯過來是交替最小二乘法。假設用戶為a,物品為b,評分矩陣為R(m, n),可分解為用戶矩陣U(k, m)和物品矩陣I(k, n),其中m, n, k代表矩陣的維度。前方小段數學公式低能預警:
1.6 求解用戶矩陣U和物品矩陣I
矩陣R是已知的,我們隨機生成用戶矩陣U, 1. 利用1.5中的式5、R和U求出I 2. 利用1.5中的式6、R和I求出U
如此交替地執行步驟1和步驟2,直到算法收斂或者迭代次數超過了最大限制,最終我們用RMSE來評價模型的好壞。
2. 做到篇
本人用全宇宙最簡單的編程語言——Python做到了ALS算法,沒有依賴任何第三方庫,便於學習和使用。簡單說明一下做到過程,更詳細的註釋請參考本人github上的代碼。
註:代碼中用到的Matrix類是我寫的一個矩陣類,可以取出矩陣的行或列,計算矩陣的乘法、轉置和逆。代碼鏈接:matrix.py
2.1 創建ALS類
初始化,存儲用戶ID、物品ID、用戶ID與用戶矩陣列號的對應關係、物品ID與物品矩陣列號的對應關係、用戶已經看過哪些物品、評分矩陣的Shape以及RMSE。
2.2 數據預處理
對訓練數據進行處理,得到用戶ID、物品ID、用戶ID與用戶矩陣列號的對應關係、物品ID與物品矩陣列號的對應關係、評分矩陣的Shape、評分矩陣及評分矩陣的轉置。
2.3 用戶矩陣乘以評分矩陣
做到稠密矩陣與稀疏矩陣的矩陣乘法,得到用戶矩陣與評分矩陣的乘積。
2.4 物品矩陣乘以評分矩陣
做到稠密矩陣與稀疏矩陣的矩陣乘法,得到物品矩陣與評分矩陣的乘積。
2.5 生成隨機矩陣
2.6 計算RMSE
2.7 訓練模型
1.數據預處理
2.變量k合法性檢查
3.生成隨機矩陣U
4.交替計算矩陣U和矩陣I,並列印RMSE信息,直到迭代次數達到max_iter
5.保存最終的RMSE
2.8 預測一個用戶
預測一個用戶感興趣的內容,剔除用戶已看過的內容。然後按感興趣分值排序,取出前n_items個內容。
2.9 預測多個用戶
循環調用2.8,預測多個用戶感興趣的內容。
3 效果評估
3.1 main函數
使用電影評分數據集,訓練模型並統計RMSE。
3.2 效果展示
設置k=3,迭代5次,並展示了前4個用戶的推薦內容,最終RMSE為0.370,運行時間46.5秒,效果還算不錯~
3.3 工具函數
本人自定義了一些工具函數,可以在github上查看
1.run_time – 測試函數運行時間
2.load_movie_ratings – 加載電影評分數據
總結
ALS的原理:雞生蛋、蛋生雞ALS的做到:基本上就是矩陣乘法