Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ruby 與推薦系統簡介
Search
tka
July 30, 2013
2.8k
15
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby 與推薦系統簡介
tka
July 30, 2013
More Decks by tka
See All by tka
2012 JavaTwo-desktop-appliction-using-j-ruby-with-swt
tka
2
2.1k
Featured
See All Featured
The Curse of the Amulet
leimatthew05
2
13k
From π to Pie charts
rasagy
0
240
My Coaching Mixtape
mlcsv
0
170
Crafting Experiences
bethany
1
220
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Automating Front-end Workflow
addyosmani
1370
210k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
900
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Transcript
Ruby 與推薦系統
About me tka http://twitter.com/tkalu http://blog.tka.lu 任職於 Handlino.com
Ruby 與推薦系統
推薦系統 from Amazon.com
推薦系統 from icook.tw
推薦系統 from www.books.com.tw
傳說中的實作方式 • 亂數 • 庫存最多的 • 利潤最高的
推薦系統的分類 • Content based • Collaborative Filtering – Item Based
– User Based
會講的內容 • Ruby 建立簡易 Collaborative Filtering 推薦系統的方式 – 使用 Recommendify
– 使用 Recommendable – 使用 JRuby + Mahout
不會講的內容 • Content based 推薦系統 • 推薦系統裡面的演算法細節 • Apache Mahout
的調整與分散運算
取得大量測試資料 • GroupLens – http://grouplens.org • MovieLens – http://www.movielens.org/ •
MovieLens Data Sets – http://grouplens.org/node/12 – MovieLens 1M - Consists of 1 million ratings from 6000 users on 4000 movies.
測試專案 • https://github.com/tka/recommender-demo – rails 4 – recommendify & recommendable
範例 • https://github.com/tka/jruby-mahout-demo – JRuby 搭配 Mahout – user based, Item based, MySQL 串接範例
Ruby Library 介紹
Recommendify 簡介 • https://github.com/paulasmuth/recommen dify • Item based • jaccard
similarity • 從指定的 Item 取得推薦的 Item
Recommendify 使用方式 class MyRecommendify < Recommendify::Base max_neighbors 10 input_matrix :movie_items,
:native => true, :similarity_func => :jaccard, :weight => 5.0 end recommender.movie_items.add_set("order1", ["movie23", "movie65"]) recommender.movie_items.add_set("order2", ["movie14", "movie23"]) recommender.process! recommender.process_item!("movie23") recommender.for("product23")
Recommendify 缺點 • Item 之間的關係有所異動時 , 需要重新將資料倒 入 redis 內
, 例如某個使用者多 like 了一部電 影 , 這時後就需要重新把所有的資料倒入 redis 後才能算出新的結果 • MovieLens 1M 的資料在 i5 2.5GHz 的機器上 倒入 redis 約需 40 分鐘 , 從 redis 的資料算出 所有推薦內容大約需 90 秒
Recommendable 簡介 • https://github.com/davidcelis/recommend able • User based • jaccard
similarity • 可直接搭配 ActiveRecord 使用 • 從指定的 User 取得推薦 Item • 從指定的 User 取得相似的 User
Recommendable 使用方式 class User < ActiveRecord::Base belongs_to :occupation has_many :ratings
has_many :movies, through: :ratings recommends :movies end user.like( Movie.where(:name => "Toy Story (1995)").first ) Recommendable::Helpers::Calculations.update_similarities_for(user.id) Recommendable::Helpers::Calculations.update_recommendations_for(user.id) user.similar_raters user.recommended_movies
Recommendable 缺點 • 只有 User 觸發 like/dislike 之類的事件時會 更新該 User
的推薦 Item – 需自行呼叫函式更新特定 User 的推薦資料方能確保 資料準確 • 第一次倒 MovieLens 1M 到 redis 需 25min, 且有異動時不須重倒 , 但是更新一個 User 的推薦資料需要 50 秒左右
JRuby +Mahout 介紹
Mahout 簡介 • http://mahout.apache.org/ • Java 實作 • 支援許多演算法 •
可搭配 hadoop 進行分散式運算
JRuby-Mahout 簡介 • https://github.com/vasinov/jruby_mahout • 只支援 Mahout 推薦系統功能中的部份功能 • 還在早期開發階段
, 缺少文件 • 實作了 PostgreSQL 直接串接 , 但是 MySQL 串接尚未實作
JRuby-Mahout 簡介 • https://github.com/vasinov/jruby_mahout • 支援多種演算法 • 可從指定的 Item 取得推薦
Item • 可從指定的 User 取得推薦 Item • 可從指定的 User 取得相似 User
JRuby-Mahout 使用方式 recommender = JrubyMahout::Recommender.new( "TanimotoCoefficientSimilarity", 5, "GenericUserBasedRecommender", false) recommender.data_model
= JrubyMahout::DataModel.new("file", { :file_path => "ratings.csv" }).data_model recommender.recommend(2, 10, nil) 以 User Based 模式計算 MovieLens 1M 中所針對 User 推薦的 Item 約費時 8 分鐘 以 Item Based 模式計算 MovieLens 1M 中所針對 Item 推薦的 Item 約費時 50 秒
JRuby-Mahout 串接 MySQL 範例 dataSource = com.mysql.jdbc.jdbc2.optional.MysqlDataSource.new; dataSource.setServerName("127.0.0.1"); dataSource.setUser("user"); dataSource.setPassword("password");
dataSource.setDatabaseName("recommender-demo_development"); dataModel = org.apache.mahout.cf.taste.impl.model.jdbc.MySQLJDBCDataModel.new( dataSource, "ratings", "user_id", "movie_id", "rate", "created_at"); recommender = JrubyMahout::Recommender.new("LogLikelihoodSimilarity", 5, "GenericUserBasedRecommender", false) recommender.data_model = dataModel
JRuby-Mahout 缺點 • 還在早期開發階段 , 缺少文件 • 需要 Java •
需要較多 Mahout 知識配合 • 需自行規劃與 Rails 的整合 • 實作了 PostgreSQL 串接 , 但是 MySQL 串接尚未 實作 • 使用 MySQL 直接串接時計算速度會慢約 500 倍
結論
Q&A