8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/recommendations/user/similarity.rb', line 8
def update_similars
Recommendations.redis.del("recommendations:similars:user:#{id}")
similar_users = {}
ratings.each do |item_id, rating|
similars = Item.find(item_id).ratings(rating)
similars.reject {|uid| uid == id}.each do |user_id|
user_rating = Recommendations.redis.zscore("recommendations:ratings:item:#{item_id}", user_id)
difference = (Float(user_rating) - Float(rating)).abs
similar_users[user_id] ||= [0,0]
similar_users[user_id][0] += difference
similar_users[user_id][1] += 1
end
end
similar_users.each do |user_id, (difference, common_items)|
difference_factor = Float(Recommendations.configuration.user_tolerance) - Float(difference)/Float(common_items)
common_items_factor = 0.2 * Float(common_items)
similar_users[user_id] = difference_factor + common_items_factor
end
similar_users.each do |user_id, score|
Recommendations.redis.zincrby("recommendations:similars:user:#{id}", score, user_id)
end
end
|