More Related Content Similar to 「沙中撈金術」﹣談開放原始碼的推薦系統 (20) 「沙中撈金術」﹣談開放原始碼的推薦系統 4. 講者簡介
• 現職
– 聖藍科技技術長
• 興趣
– 網路應用系統開發
• 譯作
– Thinking in Java 4th Edition, 正體中文版
– Thinking in Java 2nd Edition, 正體中文版
– Essential C++, 正體中文版
• 專欄
– iTHome 電腦報程式人專欄
• 連絡方式
– qing at gmail.com
– qing_wang at twitter
9. 大眾的喜好 vs. 個人的偏好
• 頭(暢銷)的部份,代表大眾的喜好
• 尾(冷門)的部份,代表個人的偏好
• 長尾的部份就像是含金的大量沙土
– 大部份的東西可能對任何一個個人都沒用
– 但也有可能藏有對特定個人極有價值的事物
• 許多系統都試著滿足大眾喜好這一塊,卻少
了個人偏好這一塊
– 熱門歌曲 vs. 你會感興趣的歌曲
10. 實體櫃位 vs. 虛擬櫃位
• 傳統實體商店櫃位有限
– 以滿足大眾喜好為主
• 網路化的虛擬商店櫃位幾近無限
– 雖然長尾中的量不大,但累積起來也可觀
– 若可滿足繁多的個人偏好,就能提供足夠的價值
15. 基於內容的推薦
• 利用項目特徵來表示內容
• 通常過程有三
– Item Representation: 抽取項目的特徵,用以表
示每一個項目(例:向量化)
– Profile Learning: 依據使用者過去的喜好來建立
起使用者的偏好記錄
– Recommendation Generation: 基於使用者的喜
好profile以及待推薦的項目的特徵來進行推薦
16. 基於內容的推薦 – 群集及分類
• Clustering
– 將特徵相近(例:在向量空間中相近)的項目自
動集結成群
– 基於群集的結果來做推薦
• Classification
– 基於過去的使用記錄來建立分類樹
– 利用分類樹的分類結果來做推薦
17. 群集及分類技術做為推薦的應用
• 新聞分群
– 將新聞自動分群,再將使用者自動分群
– 將新進分好群的新聞推薦給對該群感興趣的使用者
• 新聞分類
– 將新聞自動分至預先設定的分類
– 將新聞推薦給對該分類感興趣的使用者
• 新聞相似
– 找出和使用者感興趣新聞主題相似的新聞
• 電子郵件分類
– Spam mail
– Important mail
23. YouTube的影片推薦 (3/3)
• 推薦系統的成效
– 60% 的首頁點擊是來自於推薦
– CTR (click through rate) 比最多觀看頁還多出了
207%
• 有機會靠推薦系統來活化落在長尾中的影片
– 不會總是強者愈強,熱門者愈熱門
– 個人化特殊的需求得以得到滿足
25. Apache Mahout
• Apache Mahout™ 是個具規模可擴充性的機器學
習(machine learning)程式庫
• 開放原始碼-當然!
• Mahout在Apache Hadoop ™ 上,使用了
map/reduce的演算法,實作了 clustering,
classification, 以及 collaborative filtering的核心演
算法
• 除了跑在分散式/雲端多節點的Hadoop平台上之外
,其中也提了單一節點以及非Hadoop的實作版本
• 其核心程式庫即使是非分散式的版本,也都經高
度最佳化因而能提供極佳的效能
26. Mahout 的發展歷史
• 原先是 Lucene 中的子計畫
– 專門發展和Machine Learning有關的部份
接著獨立出來
• 整合了做CF演算法的 Taste
• 2010 年成為Apache的 top-level 專案
27. Mahout 的演算法 (1/2)
• 推薦引擎
– 指協同過濾式(Collaborative Filtering)推薦
• 分類演算法
– Bayesian, Support Vector Machine (SVM), Neural
Network, Hidden Markov Models, …
• 群集演算法
– K-Means, Fuzzy K-Means, Hierarchical Clustering, …
• Pattern Mining
– 頻繁項目集(Frequent Itemset)演算法
28. Mahout 的演算法 (2/2)
• Regression
• Dimension Reduction
– Singular Value Decomposition and other
Dimension Reduction Techniques
• Vector Similarity
30. 取得Mahout
• Mahout 是以 Java 寫成的一套程式庫
– 可運行在支援Java的各種平台
– 沒有前端的使用者介面、也不需要任何伺服器,僅供應
用程式以程式庫方式運用
• 下載
– https://cwiki.apache.org/confluence/display/MAHOUT/
Downloads
• 原始碼
– https://cwiki.apache.org/confluence/display/MAHOUT/V
ersion+Co
31. 在開始寫程式之前 …
• Mahout 只是提供演算法計算的工具
• 基於Mahout,推薦結果的優與劣將取決於
– 如何將應用上的問題轉換成演算法可處理的資料
– 選擇合適的演算法及參數
– 搭配其他的演算法或考量其他因素
32. CF推薦系統的基本元素
• Item
– 能被推薦給使用者的項目
• User
– 能對Item做評分、能被系統推薦Item的使用者
• Preference
– User對Item的評分
– { userId, itemId, rating }
33. 推薦應用實例
• YouTube
– 使用者{觀看、喜歡、不喜歡、 評分}影片
• Facebook
– 使用者{點擊、按讚}連結或狀態更新
• 新聞
– 使用者{觀看、喜歡、不喜歡}新聞
34. User-Item Matrix
Item 1 Item 2 Item 3
User a 2 3 2
User b 4 ? 3
User c 1 5 ?
35. User-based vs. Item-based
• User-based
– 基於使用者間的相似性推薦項目
• Item-based
– 基於項目間的相似性推薦給使用者
• 各有優劣
– User-based的推薦品質好
– Item-based的演算速度快
41. 簡單的推薦程式範例 (1/2)
class RecommenderIntro {
public static void main(String[] args) throws Exception {
DataModel model = new FileDataModel (new File("intro.csv"));
UserSimilarity similarity = new PearsonCorrelationSimilarity (model);
UserNeighborhood neighborhood =
new NearestNUserNeighborhood (2, similarity, model);
*此例出自 Sean Owen 等人所著 “Mahout in Action” 一書
42. 簡單的推薦程式範例 (2/2)
Recommender recommender = new
GenericUserBasedRecommender ( model, neighborhood,
similarity);
List<RecommendedItem> recommendations =
recommender.recommend(1, 1);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
}
}
RecommendedItem [item:104, value:4.257081]
*recommender.recommend(1, 1): 針對 user 1 推薦 1 個 item
44. 評估推薦結果的優劣
• 通常是利用一組現成的實際資料
– 例:以其中的70%來訓練
• 抽出部份的資料不餵給推薦系統
– 例:以其中的30%來測試
• 評估推薦結果和實際資料的落差
• Mahout提供了RecommenderEvaluator的實作類
別,供你評估推薦結果的優劣
– AverageAbsoluteDifferenceRecommenderEvaluator
– RecommenderIRStatsEvaluator -> precision/recall
48. PreferenceArray in Mahout
• 為了有效率的儲存偏好資料,Mahout特製
了一個PreferenceArray介面
– 其最簡單的實作就是
GenericUserPreferenceArray
*圖例出自Sean Owen 等人所著 “Mahout in Action” 一書
49. 提升儲存空間的效率
• 因為推薦系統的輸入資料有其固定的特性
– 例如user ID/item ID都可以用long來表示
• 所以不需要泛用的Java的一些Collection
– 例如HashMap或HashSet
– 如此一來,便可降低儲存空間以及處理的複雜度
• FastIDSet ( 平均 14 bytes ) vs. HashSet (
84 bytes )
• FastByIDMap vs. HashMap
55. 分散式/雲端化計算下的Mahout推薦
• 基於Hadoop
• 步驟
– 設定Hadoop
– 產生輸入資料檔
– 執行
org.apache.mahout.cf.taste.hadoop.item.Recommende
rJob
• Amazon’s Elastic MapReduce service
– http://aws.amazon.com/elasticmapreduce/