Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby 與推薦系統簡介

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for tka tka
July 30, 2013
2.7k

Ruby 與推薦系統簡介

Avatar for tka

tka

July 30, 2013
Tweet

Transcript

  1. 取得大量測試資料 • 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.
  2. 測試專案 • https://github.com/tka/recommender-demo – rails 4 – recommendify & recommendable

    範例 • https://github.com/tka/jruby-mahout-demo – JRuby 搭配 Mahout – user based, Item based, MySQL 串接範例
  3. 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")
  4. Recommendify 缺點 • Item 之間的關係有所異動時 , 需要重新將資料倒 入 redis 內

    , 例如某個使用者多 like 了一部電 影 , 這時後就需要重新把所有的資料倒入 redis 後才能算出新的結果 • MovieLens 1M 的資料在 i5 2.5GHz 的機器上 倒入 redis 約需 40 分鐘 , 從 redis 的資料算出 所有推薦內容大約需 90 秒
  5. Recommendable 簡介 • https://github.com/davidcelis/recommend able • User based • jaccard

    similarity • 可直接搭配 ActiveRecord 使用 • 從指定的 User 取得推薦 Item • 從指定的 User 取得相似的 User
  6. 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
  7. Recommendable 缺點 • 只有 User 觸發 like/dislike 之類的事件時會 更新該 User

    的推薦 Item – 需自行呼叫函式更新特定 User 的推薦資料方能確保 資料準確 • 第一次倒 MovieLens 1M 到 redis 需 25min, 且有異動時不須重倒 , 但是更新一個 User 的推薦資料需要 50 秒左右
  8. JRuby-Mahout 簡介 • https://github.com/vasinov/jruby_mahout • 支援多種演算法 • 可從指定的 Item 取得推薦

    Item • 可從指定的 User 取得推薦 Item • 可從指定的 User 取得相似 User
  9. 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 秒
  10. 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
  11. JRuby-Mahout 缺點 • 還在早期開發階段 , 缺少文件 • 需要 Java •

    需要較多 Mahout 知識配合 • 需自行規劃與 Rails 的整合 • 實作了 PostgreSQL 串接 , 但是 MySQL 串接尚未 實作 • 使用 MySQL 直接串接時計算速度會慢約 500 倍
  12. Q&A