Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

「これを買っている人はこれも買っています」実装してみた

1,782 views

Published on

第5回 プログラマのための数学勉強会 の発表資料です。

Published in: Software
  • Be the first to comment

「これを買っている人はこれも買っています」実装してみた

  1. 1. 「これを買っている人はこれも買っています」 実装してみた デジタルサーカス(株)長谷川智希
  2. 2. 長谷川智希 とも き @tomzoh
 とむぞう 趣味 Webサイト開発, iOSアプリ開発 レンタルカートレース, ビール, 電子工作 (mbed), … TOMZOH デジタルサーカス(株)
 副団長CTO Facebook CakePHP iOS
  3. 3. デジタルサーカス(株) ・ Webサイト開発 ・ スマホアプリ開発 ・ 自社サービス ( ) (iOS, Android) (http://appbuilder.jp) Twitter: @tomzoh
  4. 4. Twitter: @tomzoh
  5. 5. 今日のテーマ: 「これを買っている人はこれも買っています」 実装してみた
  6. 6. 経緯
  7. 7. http://www.hasegawa-tomoki.com/blog/2014/10/19/ios8swift-yahoo/
  8. 8. 数学勉強会とかやろうかなー
  9. 9. いいじゃないですか!行きます! 協調フィルタリングとか興味あったので勉強してLTします! 数学勉強会とかやろうかなー
  10. 10. いいじゃないですか!行きます! 協調フィルタリングとか興味あったので勉強してLTします! 数学勉強会とかやろうかなー やります! 今回はLT枠作れなかった…
  11. 11. いいじゃないですか!行きます! 協調フィルタリングとか興味あったので勉強してLTします! 参加者として行きます! 数学勉強会とかやろうかなー やります! 今回はLT枠作れなかった…
  12. 12. 「あれ?思ったよりガチじゃね?」
  13. 13. 「…」
  14. 14. 「ガチだー!」
  15. 15. いいじゃないですか!行きます! 協調フィルタリングとか興味あったので勉強してLTしますよ!
  16. 16. いいじゃないですか!行きます! 協調フィルタリングとか興味あったので勉強してLTしますよ! あんなガチ空間でLTとか…恐れ多い…!
  17. 17. ついに来てしまった… しかし協調フィルタリングを勉強したいのは事実。 やるよ!
  18. 18. (( )) ガクガクブルブル
  19. 19. 今日のテーマ: 「これを買っている人はこれも買っています」 実装してみた
  20. 20. Toby Segaran 著 當山 仁健、鴨澤 眞夫 訳 出版社: オライリージャパン 2008年07月 発行 392ページ ISBN978-4-87311-364-7 http://www.amazon.co.jp/dp/4873113644
  21. 21. 2章 推薦を行う 「この映画に高い評価をした人は、こんな 映画にも高い評価をしています。」のアルゴ リズム。 ・自分に似ている人は誰か ・この映画に似ている映画は何か
  22. 22. # 映画の評者といくつかの映画に対する彼らの評点のディクショナリ
 critics={ 'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5, 'The Night Listener': 3.0}, 'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5, 'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 3.5}, 'Michael Phillips': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.0, 'Superman Returns': 3.5, 'The Night Listener': 4.0}, 'Claudia Puig': {'Snakes on a Plane': 3.5, 'Just My Luck': 3.0, 'The Night Listener': 4.5, 'Superman Returns': 4.0, 'You, Me and Dupree': 2.5}, 'Mick LaSalle': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'Just My Luck': 2.0, 'Superman Returns': 3.0, 'The Night Listener': 3.0, 'You, Me and Dupree': 2.0}, 'Jack Matthews': {'Lady in the Water': 3.0, 'Snakes on a Plane': 4.0, 'The Night Listener': 3.0, 'Superman Returns': 5.0, 'You, Me and Dupree': 3.5}, 'Toby': {'Snakes on a Plane':4.5,'You, Me and Dupree':1.0,'Superman Returns’:4.0} }
  23. 23. やりたいこと ・ 「このリポジトリにスターした⼈はこんなリポジ トリにもスターしています」 ・ ⾒ると嬉しいであろうリポジトリをお勧めして くれるシステム!
  24. 24. 推薦: 2つの⽅法 (1)⾃分に似たユーザを探して、そのユーザが スターしているリポジトリを推薦する。 (2)⾃分がスターしているリポジトリについて、 似たリポジトリを探して推薦する。
  25. 25. 「似ている」 どうやって「似ている」と判断するか。
  26. 26. 「似ている」 どうやって「似ている」と判断するか。 「似ている」 = 「近い」
  27. 27. ユークリッド距離 63 2 3
  28. 28. ユークリッド距離 sqrt((6-3)^2 + (2-3)^2) = 3.16… 63 2 3 3.16…
  29. 29. ユークリッド距離 John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4
  30. 30. ユークリッド距離 John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4 JohnとSteveの距離:
  31. 31. ユークリッド距離 John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4 JohnとSteveの距離: sqrt((1-1)^2 + (2-1)^2 + (2-0)^2 + (3-5)^2))
  32. 32. ユークリッド距離 John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4 JohnとSteveの距離: sqrt((1-1)^2 + (2-1)^2 + (2-0)^2 + (3-5)^2)) ( - )^2 + ( - )^2 + ( - )^2 + ( - )^2
  33. 33. John Steve Tim Philip John - 3 4.2 2 Steve * - 5.9 3.3 Tim * * - 5.8 Philip * * * -
  34. 34. John Steve Tim Philip John - 3 4.2 2 Steve * - 5.9 3.3 Tim * * - 5.8 Philip * * * - John Steve Tim Philip John - 3 4.2 2 Steve * - 5.9 3.3 Tim * * - 5.8 Philip * * * - TimにはJohnが⾒た映画を推薦すれば良さそう
  35. 35. John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4
  36. 36. John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4 John Steve Tim Philip The Shawshank Redemption 1 1 2 2 The Man in the Iron Mask 2 1 4 1 ID4 2 3 The Devil Wears Prada 3 5 4
  37. 37. http://www.amazon.co.jp/dp/B0083RQI0S BUY NOW
  38. 38. 話を戻して… (1)⾃分に似たユーザを探して、そのユーザが スターしているリポジトリを推薦する。 (2)⾃分がスターしているリポジトリについて、 似たリポジトリを探して推薦する。
  39. 39. ⭐ Repo 88,811 twbs/bootstrap 45,137 vhf/free-programming-books 44,106 angular/angular.js 43,279 mbostock/d3 37,667 nodejs/node-v0.x-archive 36,648 jquery/jquery 31,681 h5bp/html5-boilerplate 31,461 FreeCodeCamp/FreeCodeCamp 31,080 facebook/react 29,881 robbyrussell/oh-my-zsh 29,651 meteor/meteor 29,413 github/gitignore 28,336 rails/rails 27,248 torvalds/linux 27,111 Homebrew/homebrew
  40. 40. User mvied dcwatson christophwille rpoisel victoriafrench runcom brynary marceloemanoel ysrb Caged anotherjesse kevwil rsanheim BrianTheCoder lancecarlson kvnsmth josh ⭐ Repo 88,811 twbs/bootstrap 45,137 vhf/free-programming-books 44,106 angular/angular.js 43,279 mbostock/d3 37,667 nodejs/node-v0.x-archive 36,648 jquery/jquery 31,681 h5bp/html5-boilerplate 31,461 FreeCodeCamp/FreeCodeCamp 31,080 facebook/react 29,881 robbyrussell/oh-my-zsh 29,651 meteor/meteor 29,413 github/gitignore 28,336 rails/rails 27,248 torvalds/linux 27,111 Homebrew/homebrew
  41. 41. GitHubのデータ数
  42. 42. リポジトリ 約1千400万
  43. 43. リポジトリ 約1千400万 ユーザ 約1千600万
  44. 44. mvied dcwatson rpoisel ysrb twbs/bootstrap vhf/free-programming-books angular/angular.js : ⭐ ⭐ ⭐ ⭐ ⭐ ⭐⭐ ⭐
  45. 45. mvied dcwatson rpoisel ysrb twbs/bootstrap vhf/free-programming-books angular/angular.js : ユーザ 約1千600万 ⭐ ⭐ ⭐ ⭐ ⭐ ⭐⭐ ⭐
  46. 46. mvied dcwatson rpoisel ysrb twbs/bootstrap vhf/free-programming-books angular/angular.js : ユーザ 約1千600万 リポジトリ約1千400万 ⭐ ⭐ ⭐ ⭐ ⭐ ⭐⭐ ⭐
  47. 47. mvied dcwatson rpoisel ysrb twbs/bootstrap vhf/free-programming-books angular/angular.js : ユーザ 約1千600万 リポジトリ約1千400万 ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ 😱 ⭐ ⭐
  48. 48. じゃあどうしたか
  49. 49. リポジトリ ⭐ スターを付けたユーザの一覧 twbs/bootstrap 88,811 mvied dcwatson ysrb … vhf/free-programming-books 45,137 mvied dcwatson rpoisel … angular/angular.js 44,106 dcwatson ysrb … :
  50. 50. リポジトリ ⭐ スターを付けたユーザの一覧 twbs/bootstrap 88,811 mvied dcwatson ysrb … vhf/free-programming-books 45,137 mvied dcwatson rpoisel … angular/angular.js 44,106 dcwatson ysrb … : リポジトリ350件☆6,700以上ぐらい
  51. 51. リポジトリ ⭐ スターを付けたユーザの一覧 twbs/bootstrap 88,811 mvied dcwatson ysrb … vhf/free-programming-books 45,137 mvied dcwatson rpoisel … angular/angular.js 44,106 dcwatson ysrb … : リポジトリ350件☆6,700以上ぐらい ユーザ 最⼤88,811
  52. 52. リポジトリ ⭐ スターを付けたユーザの一覧 twbs/bootstrap 88,811 mvied dcwatson ysrb … vhf/free-programming-books 45,137 mvied dcwatson rpoisel … ・ スターを付けている: 1 付けていない: 0 ・ リポジトリ間のユークリッド距離を計算
  53. 53. twbs/bootstrap vhf/free- programming-books angular/angular.js … twbs/bootstrap - 0.01904850 0.00492629 vhf/free- programming-books * - 0.00492461 angular/angular.js * * - : ユークリッド距離
  54. 54. GitHub recommender http://ghrec.hasegawa-tomoki.com ・ GitHubのユーザ名を⼊⼒すると
 おすすめリポジトリを表⽰ ・ APIで⭐を付けているリポジトリ取得 → そのリポジトリに似ているリポジトリを推薦
  55. 55. ・ GitHubのユーザ名
  56. 56. GitHub recommender http://ghrec.hasegawa-tomoki.com
  57. 57. GitHub recommender http://ghrec.hasegawa-tomoki.com ・ 取得: ⭐数上位6,800リポジトリ
  58. 58. GitHub recommender http://ghrec.hasegawa-tomoki.com ・ 取得: ⭐数上位6,800リポジトリ ・ 計算: ⭐数上位350リポジトリ
  59. 59. GitHub recommender http://ghrec.hasegawa-tomoki.com ・ 取得: ⭐数上位6,800リポジトリ ・ 計算: ⭐数上位350リポジトリ ・ 計算量ナメてて間に合わなかった
  60. 60. GitHub recommender http://ghrec.hasegawa-tomoki.com ・ 取得: ⭐数上位6,800リポジトリ ・ これが O(n^2) というやつか… ・ 計算: ⭐数上位350リポジトリ ・ 計算量ナメてて間に合わなかった
  61. 61. わかったこと ・ APIでデータを取るのにすごく時間がかかる。 ・ リポジトリ間の距離を計算するのにすごく時間がかかる。 ・ このクラスの計算量になると最初からまじめにプログラムを チューニングしないといつまでたっても終わらない。 ・ memcachedの圧縮は素晴らしい。 ・ 超簡単な割にそれなりにそれっぽい結果が出るので楽しい。
  62. 62. 時間があれば…
  63. 63. どの程度「それらしい」か
  64. 64. アーキテクチャ
  65. 65. GitHub API ・ 時間あたりの利⽤可能数が制限されている。 ・ レイテンシは1秒ぐらい。 ・ 全てのレコードが取得できる訳では無い。 ・ ページ数を指定して取得することになるけど「これ以上は取れないよ」とレ スポンスが帰ってくる。 ・ 「リポジトリをスター数の降順で」は結構⾯倒。 ・ 検索条件にリポジトリ作成⽇時、スター数を⼊れて複数回コール。
  66. 66. ⭐を取得するAPI https://api.github.com/repos/twbs/bootstrap/stargazers
  67. 67. ⭐を取得するAPI https://api.github.com/repos/twbs/bootstrap/stargazers
  68. 68. ⭐を取得するAPI https://api.github.com/repos/twbs/bootstrap/stargazers
  69. 69. こういうのを作って 計算状況がわかる様にすると 精神衛⽣上良い。
  70. 70. ありがとうございました @tomzoh デジタルサーカス(株) Drupal & スマホエンジニア 絶賛 募集中!

×