「沙中撈金術」﹣談開放原始碼的推薦系統
Upcoming SlideShare
Loading in...5
×
 

「沙中撈金術」﹣談開放原始碼的推薦系統

on

  • 4,821 views

 

Statistics

Views

Total Views
4,821
Views on SlideShare
4,819
Embed Views
2

Actions

Likes
26
Downloads
222
Comments
0

2 Embeds 2

http://tweetedtimes.com 1
https://si0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

「沙中撈金術」﹣談開放原始碼的推薦系統 「沙中撈金術」﹣談開放原始碼的推薦系統 Presentation Transcript

  • 王建興
  • 專家講座D:「沙中撈金術」﹣談開放原始碼的推薦系統
  • 簡介:對於資訊,現代人面對的問題早已不是資訊的不足,而是資訊的爆炸。網路上無數的部落格文章、新聞消息、網路影片、音樂、商品資訊等,這種情況往往讓人們不知如何在海量的資訊中找到符合自己需求的資訊,除了搜尋引擎之外,所謂的「推薦系統」則是另一種方向的解決方案。在這個講題中,會介紹推薦系統的基本觀念、被普遍使用的開放原始碼推薦系統、以及透過這樣的系統可以協助我們解決什麼樣應用上的問題。
  • 講者簡介• 現職 – 聖藍科技技術長• 興趣 – 網路應用系統開發• 譯作 – Thinking in Java 4th Edition, 正體中文版 – Thinking in Java 2nd Edition, 正體中文版 – Essential C++, 正體中文版• 專欄 – iTHome 電腦報程式人專欄• 連絡方式 – qing at gmail.com – qing_wang at twitter
  • 綱要• 推薦系統概說• Mahout簡介• 結論
  • 推薦系統概說
  • 為什麼需要推薦系統• 資訊不患寡,患不準– 太多資訊反而使得人們不知從中取得所需的資訊• 過去倚賴資訊系統收集愈多的資料• 今日期待資訊系統過濾出符合需求的資料
  • 長尾理論*取自Wikipedia
  • 大眾的喜好 vs. 個人的偏好• 頭(暢銷)的部份,代表大眾的喜好• 尾(冷門)的部份,代表個人的偏好• 長尾的部份就像是含金的大量沙土– 大部份的東西可能對任何一個個人都沒用– 但也有可能藏有對特定個人極有價值的事物• 許多系統都試著滿足大眾喜好這一塊,卻少了個人偏好這一塊– 熱門歌曲 vs. 你會感興趣的歌曲
  • 實體櫃位 vs. 虛擬櫃位• 傳統實體商店櫃位有限– 以滿足大眾喜好為主• 網路化的虛擬商店櫃位幾近無限– 雖然長尾中的量不大,但累積起來也可觀– 若可滿足繁多的個人偏好,就能提供足夠的價值
  • 長尾理論中的過濾器• 過濾器能協助我們,找出長尾中大量沙土中所暗藏的黄金• 搜尋引擎做為過濾器– Google的興起,和它提供了一個有用的過濾器 有關– Google的搜尋引擎很強,但搜尋引擎也有其先 天的限制• 推薦系統做為過濾器– 基於個人的使用習慣及偏好,自動的找出使用者 可能會感興趣的資訊
  • 推薦系統• 所謂的推薦系統,能自動的依據使用者的喜好,以及使用行為,向使用者推薦他可能會感興趣的資訊(或商品)
  • 推薦系統的分類• 基於關聯式規則的推薦(Association Rule)• 基於內容的推薦(Content-based )• 協同過濾式的推薦(Collaborative Filtering)• 人口統計式的推薦(Demographic)
  • 關聯式規則• 推算項目之間的關聯性,例如:– 「如果一個消費者購買了產品A,那麼他有多大 機會購買產品B?」– 「如果他購買了產品C和D,那麼他還將購買什 麼產品?」• 購物籃分析– 一起結帳的商品有關聯性– 啤酒和尿布
  • 基於內容的推薦• 利用項目特徵來表示內容• 通常過程有三– Item Representation: 抽取項目的特徵,用以表 示每一個項目(例:向量化)– Profile Learning: 依據使用者過去的喜好來建立 起使用者的偏好記錄– Recommendation Generation: 基於使用者的喜 好profile以及待推薦的項目的特徵來進行推薦
  • 基於內容的推薦 – 群集及分類• Clustering – 將特徵相近(例:在向量空間中相近)的項目自 動集結成群 – 基於群集的結果來做推薦• Classification – 基於過去的使用記錄來建立分類樹 – 利用分類樹的分類結果來做推薦
  • 群集及分類技術做為推薦的應用• 新聞分群 – 將新聞自動分群,再將使用者自動分群 – 將新進分好群的新聞推薦給對該群感興趣的使用者• 新聞分類 – 將新聞自動分至預先設定的分類 – 將新聞推薦給對該分類感興趣的使用者• 新聞相似 – 找出和使用者感興趣新聞主題相似的新聞• 電子郵件分類 – Spam mail – Important mail
  • 協同過濾式的推薦• 社會化的推薦技術– 集合眾人的使用偏好來做推薦• 基於使用者之間的相似性來做推薦– 和你使用習慣相近的使用者,他喜歡的項目,你多半也 會喜歡– 如果以前你們買的東西很像,那麼他買的東西,你可能 也會想買• YouTube的推薦系統,主要即基於協同過濾式的推薦
  • 人口統計式的推薦• 將使用者依其個人屬性做分類的指標,並以此類別做為推薦的基礎– 性別、年齡、教育背景、居住地、語言
  • 善用推薦引擎的例子• Amazon – 書目、商品的推薦• Netflix – 影片的推薦• YouTube – 短片的推薦
  • YouTube的影片推薦 (1/3)• 系統目標– 推薦的影片要夠新– 推薦的影片主題要夠分散,而且和使用者最近的 行為相關– 能讓使用者明白為什麼系統將某影片推薦給他• 基於使用者個人的活動– 看過、最愛、喜歡
  • YouTube的影片推薦 (2/3)• 從video的co-visitation graph來展開• 基於各種相關性及相異性的指標來做 ranking• 和租片或線上購片系統的推薦有所不同 – YouTube使用者的活動巨量且頻繁 – YouTube影片的metadata少
  • YouTube的影片推薦 (3/3)• 推薦系統的成效– 60% 的首頁點擊是來自於推薦– CTR (click through rate) 比最多觀看頁還多出了 207%• 有機會靠推薦系統來活化落在長尾中的影片– 不會總是強者愈強,熱門者愈熱門– 個人化特殊的需求得以得到滿足
  • Mahout 簡介
  • Apache Mahout• Apache Mahout™ 是個具規模可擴充性的機器學 習(machine learning)程式庫• 開放原始碼-當然!• Mahout在Apache Hadoop ™ 上,使用了 map/reduce的演算法,實作了 clustering, classification, 以及 collaborative filtering的核心演 算法• 除了跑在分散式/雲端多節點的Hadoop平台上之外 ,其中也提了單一節點以及非Hadoop的實作版本• 其核心程式庫即使是非分散式的版本,也都經高 度最佳化因而能提供極佳的效能
  • Mahout 的發展歷史• 原先是 Lucene 中的子計畫 – 專門發展和Machine Learning有關的部份 接著獨立出來• 整合了做CF演算法的 Taste• 2010 年成為Apache的 top-level 專案
  • 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)演算法
  • Mahout 的演算法 (2/2)• Regression• Dimension Reduction – Singular Value Decomposition and other Dimension Reduction Techniques• Vector Similarity
  • 為什麼要基於Hadoop• 推薦系統通常要處理大量、海量的資料– 計算的規模可擴充性就很重要• Hadoop是Apache軟體基金會計畫中裡開放原始碼的並行運算工具和分散式檔案系統– MapReduce– HDFS• 只要增加新的節點就能提供更多的計算量– 解決規模可擴充性問題
  • 取得Mahout• Mahout 是以 Java 寫成的一套程式庫 – 可運行在支援Java的各種平台 – 沒有前端的使用者介面、也不需要任何伺服器,僅供應 用程式以程式庫方式運用• 下載 – https://cwiki.apache.org/confluence/display/MAHOUT/ Downloads• 原始碼 – https://cwiki.apache.org/confluence/display/MAHOUT/V ersion+Co
  • 在開始寫程式之前 …• Mahout 只是提供演算法計算的工具• 基於Mahout,推薦結果的優與劣將取決於– 如何將應用上的問題轉換成演算法可處理的資料– 選擇合適的演算法及參數– 搭配其他的演算法或考量其他因素
  • CF推薦系統的基本元素• Item – 能被推薦給使用者的項目• User – 能對Item做評分、能被系統推薦Item的使用者• Preference – User對Item的評分 – { userId, itemId, rating }
  • 推薦應用實例• YouTube – 使用者{觀看、喜歡、不喜歡、 評分}影片• Facebook – 使用者{點擊、按讚}連結或狀態更新• 新聞 – 使用者{觀看、喜歡、不喜歡}新聞
  • User-Item Matrix Item 1 Item 2 Item 3 User a 2 3 2 User b 4 ? 3 User c 1 5 ?
  • User-based vs. Item-based• User-based – 基於使用者間的相似性推薦項目• Item-based – 基於項目間的相似性推薦給使用者• 各有優劣 – User-based的推薦品質好 – Item-based的演算速度快
  • 相鄰(Neighborhood) • 推薦和你相鄰(最相似)的那群人也感興趣的*圖例源自於 Daniel Glauser 的“Machine Learning with Apache Mahout”
  • 相似度(Similarity)• 何謂相似?• 定義了相似才能知道那一些是最相似• 相似度是推薦技術中很重要的基礎– 不單是對CF而言– 相似就是接近(接近你會感興趣的東西)• 我們可以用很多方式來定義相似– 例如:在向量空間中兩向量間的距離(餘弦角度)
  • Mahout中提供的相似度演算法• Pearson Correlation Similarity• Euclidian Distance Similarity• Tanimoto Coefficient Similarity• Log Likelyhood Similarity•…
  • 例:Pearson Correlation Similarity• 基於關聯性得出的相似度• P(a,i) = 使用者a 與使用者i 間的相似度• 使用者a 對第 j 個產品的喜好程度• 使用者對i 對第 j 個產品的喜好程度• 使用者 i 的平均喜好程度• 使用者a 的平均喜好程度
  • Pearson Correlation Similarity• 此相似性定義可得出介於1至-1間的值• 值為1 – 兩個數列傾向相似• 值為0 – 兩個數列沒有相似傾向• 值為-1 – 兩個數列傾向相反
  • 簡單的推薦程式範例 (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” 一書
  • 簡單的推薦程式範例 (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
  • 各組成之間的關係
  • 評估推薦結果的優劣• 通常是利用一組現成的實際資料 – 例:以其中的70%來訓練• 抽出部份的資料不餵給推薦系統 – 例:以其中的30%來測試• 評估推薦結果和實際資料的落差• Mahout提供了RecommenderEvaluator的實作類 別,供你評估推薦結果的優劣 – AverageAbsoluteDifferenceRecommenderEvaluator – RecommenderIRStatsEvaluator -> precision/recall
  • Mahout中的輸入資料表示• 前例中已運用DataModel/FileDataModel來表示輸入資料• DataModel即Mahout中用以封裝輸入資料的介面• DataModel基本上儲存了若干組使用者對項目的偏好
  • Mahout中的使用者偏好• Mahout用Preference介面來表示使用者偏好 – long userID – long itemID – float value• 最簡單的Preference實作就是GenericPreference – GenericPreference(long userID, long itemID, float value)
  • 輸入資料必須被有效率的儲存• 推薦系統要面對的時常是海量的資料 – 每一byte都必須斤斤計較• 一組Preference該如何表示? – Collection<Preference>還是Preference[]? – 都太佔用記憶體 *圖例出自Sean Owen 等人所著 “Mahout in Action” 一書
  • PreferenceArray in Mahout • 為了有效率的儲存偏好資料,Mahout特製 了一個PreferenceArray介面 – 其最簡單的實作就是 GenericUserPreferenceArray*圖例出自Sean Owen 等人所著 “Mahout in Action” 一書
  • 提升儲存空間的效率• 因為推薦系統的輸入資料有其固定的特性 – 例如user ID/item ID都可以用long來表示• 所以不需要泛用的Java的一些Collection – 例如HashMap或HashSet – 如此一來,便可降低儲存空間以及處理的複雜度• FastIDSet ( 平均 14 bytes ) vs. HashSet ( 84 bytes )• FastByIDMap vs. HashMap
  • GenericDataModel如何實作• GenericDataModel是最簡單的DataModel – In-memory• GenericDataModel利用FastByIDMap將多個user ID對映到PreferenceArray – 藉以儲存多個使用者的偏好
  • 輸入資料的更新• Mahout中透過Refreshable介面來處理輸入資料的更新事宜• 當資料有所更新時,所有實作Refreshable的類別,都可以被呼叫refresh()來做更新 – 例如Recommender在被呼叫refresh()時,會先 呼叫DataModel的refresh(),接著自己再做更新 的動作• FileDataModel支援更新檔 – 將更新的資料以另一更新檔儲存,如此便毋需全 盤更新
  • 將輸入資料儲存於資料庫中• 將資料儲存在關聯式資料庫 – 儲存在記憶體中雖然快,但很多時候記憶體不夠 大• JDBCDataModel – MySQLJDBCDataModel• Mahout對JDBCDataModel有預設的既定 schema
  • 沒有偏好程度的偏好• 只分喜歡和沒有喜歡二者 – 例如:Facebook的讚• BooleanPrefDataModel – 實際上偏好值都是1.0
  • Mahout大幅簡化推薦程序• 應用程式的開發者的焦點– 如何產生好的輸入資料– 挑選適合的演算法參數(相似度、相鄰)– 搭配多種推薦技術或後處理動作,綜合評分排序
  • 分散式/雲端化計算下的Mahout推薦• 基於Hadoop• 步驟 – 設定Hadoop – 產生輸入資料檔 – 執行 org.apache.mahout.cf.taste.hadoop.item.Recommende rJob• Amazon’s Elastic MapReduce service – http://aws.amazon.com/elasticmapreduce/
  • 結論• Mahout中提供了許多在Machine Learning以及CF 推薦中有用的演算法實作 – 同時考量到實際上會有的海量資料• Mahout大幅簡化這些演算法的實作運用於程式設 計上的程序• Mahout可依需要做單機的運用,或分散式甚至是 雲端上的計算• 有了Mahout後,應用開發者可以更專注在輸入及 輸出資料的處理,而這才是應用上的大問題
  • Thanksqing.chwang at gmail.com