SlideShare a Scribd company logo
王建興
專家講座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後,應用開發者可以更專注在輸入及
 輸出資料的處理,而這才是應用上的大問題
Thanks
qing.chwang at gmail.com

More Related Content

PPTX
全文搜尋引擎的進階實作與應用
PPT
Java 的開放原碼全文搜尋技術 - Lucene
PPTX
排隊應用開發
PPTX
Microsoft recommendation solution on azure
PPT
Java SE 8 技術手冊第 10 章 - 輸入輸出
PDF
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
PPT
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
PDF
Java SE 7 技術手冊投影片第 05 章 - 物件封裝
全文搜尋引擎的進階實作與應用
Java 的開放原碼全文搜尋技術 - Lucene
排隊應用開發
Microsoft recommendation solution on azure
Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 7 技術手冊投影片第 05 章 - 物件封裝

Viewers also liked (20)

PPTX
Mahout資料分析基礎入門
PDF
經典研讀讀書會 2009 06_24 主讀者:洪偉朕_
PPT
開發實用創新的 Android 應用程式
PPT
開放原始碼的回收與再利用
PPT
lwdba – 開放原始碼的輕量級資料庫存取程式庫
PPTX
認識 C++11 新標準及使用 AMP 函式庫作平行運算
PPT
IKVM.NET 深入敵營的 Java
PPT
在雲端上啜飲爪哇
PPT
Introduction to C++ over CLI
PPT
從 Java programmer 的觀點看 ruby
PDF
Hp54 如何開始一個讀書會 分享
PPTX
Introduction to Apache Mahout
PPTX
Tag based recommender system
PPTX
陸:讀書會 Ch1 社交網站界面設計 破冰_公開版
PDF
Elasticsearch 實戰介紹
PPTX
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
PDF
Elasticsearch 簡介
PPTX
從開發人員角度十分鐘理解區塊鏈技術
PPTX
Apache Mahout 於電子商務的應用
PDF
Building a Recommendation Engine - An example of a product recommendation engine
Mahout資料分析基礎入門
經典研讀讀書會 2009 06_24 主讀者:洪偉朕_
開發實用創新的 Android 應用程式
開放原始碼的回收與再利用
lwdba – 開放原始碼的輕量級資料庫存取程式庫
認識 C++11 新標準及使用 AMP 函式庫作平行運算
IKVM.NET 深入敵營的 Java
在雲端上啜飲爪哇
Introduction to C++ over CLI
從 Java programmer 的觀點看 ruby
Hp54 如何開始一個讀書會 分享
Introduction to Apache Mahout
Tag based recommender system
陸:讀書會 Ch1 社交網站界面設計 破冰_公開版
Elasticsearch 實戰介紹
JavaScript 物件導向觀念入門 v.s. TypeScript 開發實戰 (微軟實戰課程日)
Elasticsearch 簡介
從開發人員角度十分鐘理解區塊鏈技術
Apache Mahout 於電子商務的應用
Building a Recommendation Engine - An example of a product recommendation engine
Ad

Similar to 「沙中撈金術」﹣談開放原始碼的推薦系統 (6)

PDF
Bigdata 大資料分析實務 (進階上機課程)
PPTX
Bigdata 大資料分析實務 (進階上機課程)
PDF
Hadoop ecosystem - hadoop 生態系
PPTX
Hadoop 介紹 20141024
PDF
深入淺出 autocomplete
PDF
Hadoop Big Data 成功案例分享
Bigdata 大資料分析實務 (進階上機課程)
Bigdata 大資料分析實務 (進階上機課程)
Hadoop ecosystem - hadoop 生態系
Hadoop 介紹 20141024
深入淺出 autocomplete
Hadoop Big Data 成功案例分享
Ad

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