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
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
190
Are puppies a ranking factor?
jonoalderson
1
3.6k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
Optimizing for Happiness
mojombo
378
71k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
Designing Experiences People Love
moore
143
24k
Between Models and Reality
mayunak
4
350
WENDY [Excerpt]
tessaabrams
11
38k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Chasing Engaging Ingredients in Design
codingconduct
0
230
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
420
We Are The Robots
honzajavorek
0
250
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