Module: CollaborativeFiltering
- Defined in:
- lib/collaborative_filtering/version.rb,
lib/collaborative_filtering/collaborative_filtering.rb
Defined Under Namespace
Modules: Sample
Constant Summary collapse
- VERSION =
'0.6.2'
Class Method Summary collapse
- .get_recommendations(prefs, person, similarity = :sim_pearson) ⇒ Object
- .shared_items_a(prefs, person1, person2) ⇒ Object
- .sim_distance(prefs, person1, person2) ⇒ Object
- .sim_pearson(prefs, person1, person2) ⇒ Object
- .top_matches(prefs, person, n = 5, similarity = :sim_pearson) ⇒ Object
- .transform_prefs(prefs) ⇒ Object
Class Method Details
.get_recommendations(prefs, person, similarity = :sim_pearson) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/collaborative_filtering/collaborative_filtering.rb', line 34 def get_recommendations(prefs, person, similarity = :sim_pearson) totals_h = Hash.new(0) sim_sums_h = Hash.new(0) prefs.each_key do |other| next if other == person sim = __send__(similarity, prefs, person, other) next if sim <= 0 prefs[other].each_key do |item| if !prefs[person].keys.include?(item) || prefs[person][item] == 0 totals_h[item] += prefs[other][item] * sim sim_sums_h[item] += sim end end end rankings = [] totals_h.each { |item, total| rankings << [total / sim_sums_h[item], item] } rankings.sort.reverse end |
.shared_items_a(prefs, person1, person2) ⇒ Object
66 67 68 |
# File 'lib/collaborative_filtering/collaborative_filtering.rb', line 66 def shared_items_a(prefs, person1, person2) prefs[person1].keys & prefs[person2].keys end |
.sim_distance(prefs, person1, person2) ⇒ Object
3 4 5 6 7 8 |
# File 'lib/collaborative_filtering/collaborative_filtering.rb', line 3 def sim_distance(prefs, person1, person2) shared_items_a = shared_items_a(prefs, person1, person2) return 0 if shared_items_a.size == 0 sum_of_squares = shared_items_a.inject(0) { |a, e| a + (prefs[person1][e] - prefs[person2][e])**2 } 1 / (1 + sum_of_squares) end |
.sim_pearson(prefs, person1, person2) ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/collaborative_filtering/collaborative_filtering.rb', line 10 def sim_pearson(prefs, person1, person2) shared_items_a = shared_items_a(prefs, person1, person2) n = shared_items_a.size return 0 if n == 0 sum1 = shared_items_a.inject(0) { |a, e| a + prefs[person1][e] } sum2 = shared_items_a.inject(0) { |a, e| a + prefs[person2][e] } sum1_sq = shared_items_a.inject(0) { |a, e| a + prefs[person1][e]**2 } sum2_sq = shared_items_a.inject(0) { |a, e| a + prefs[person2][e]**2 } sum_products = shared_items_a.inject(0) { |a, e| a + prefs[person1][e] * prefs[person2][e] } num = sum_products - (sum1 * sum2 / n) den = Math.sqrt((sum1_sq - sum1**2 / n) * (sum2_sq - sum2**2 / n)) return 0 if den == 0 num / den end |
.top_matches(prefs, person, n = 5, similarity = :sim_pearson) ⇒ Object
28 29 30 31 32 |
# File 'lib/collaborative_filtering/collaborative_filtering.rb', line 28 def top_matches(prefs, person, n = 5, similarity = :sim_pearson) scores = [] prefs.each_key { |k| scores << [__send__(similarity, prefs, person, k), k] if k != person } scores.sort.reverse[0, n] end |
.transform_prefs(prefs) ⇒ Object
55 56 57 58 59 60 61 62 63 64 |
# File 'lib/collaborative_filtering/collaborative_filtering.rb', line 55 def transform_prefs(prefs) result = {} prefs.each do |person, score_h| score_h.each do |item, score| result[item] ||= {} result[item][person] = score end end result end |