Introduction
We want to recommend things people might like by looking at either similar users or similar items.
We want to recommend things people might like by looking at either similar users or similar items.
User-based Collaborative Filtering: 1. Find users similar to the target user. 2. Recommend items liked by those similar users. Item-based Collaborative Filtering: 1. Find items similar to the items the user liked. 2. Recommend those similar items to the user.
User-based looks at people like you.
Item-based looks at things like what you liked.
User-based: User A likes items 1, 2 User B likes items 2, 3 User C likes items 1, 3 To recommend for User A, find users like B or C and suggest their liked items.
Item-based: User A likes item 1 Find items similar to item 1 (like item 2) Recommend item 2 to User A.
This code shows how to compute user-based and item-based recommendations using cosine similarity on a small rating matrix.
import numpy as np from sklearn.metrics.pairwise import cosine_similarity # User-item rating matrix (rows: users, cols: items) ratings = np.array([ [5, 3, 0, 1], # User 0 [4, 0, 0, 1], # User 1 [1, 1, 0, 5], # User 2 [1, 0, 0, 4], # User 3 [0, 1, 5, 4], # User 4 ]) # User-based Collaborative Filtering user_sim = cosine_similarity(ratings) # Recommend for User 0 user_id = 0 similar_users = np.argsort(-user_sim[user_id]) # descending order print(f"User similarities for User {user_id}: {user_sim[user_id]}") print(f"Users sorted by similarity: {similar_users}") # Find items liked by similar users but not by User 0 user_0_items = ratings[user_id] > 0 recommendations = np.zeros(ratings.shape[1]) for other_user in similar_users[1:]: # skip self other_items = ratings[other_user] > 0 new_items = other_items & ~user_0_items recommendations += ratings[other_user] * new_items print(f"User-based recommendation scores for User {user_id}: {recommendations}") # Item-based Collaborative Filtering item_sim = cosine_similarity(ratings.T) # Items User 0 liked liked_items = np.where(user_0_items)[0] # Sum similarity scores for items similar to liked items item_recommendation_scores = np.zeros(ratings.shape[1]) for item in liked_items: item_recommendation_scores += item_sim[item] # Remove items already liked item_recommendation_scores[liked_items] = 0 print(f"Item similarities matrix:\n{item_sim}") print(f"Item-based recommendation scores for User {user_id}: {item_recommendation_scores}")
User-based can be slow if many users exist.
Item-based is often faster and more stable.
Both need enough data to find good similarities.
User-based recommends items liked by similar users.
Item-based recommends items similar to what the user liked.
Both help suggest new things in recommendation systems.
recommend_items = find_similar_items(user_liked_items) calls find_similar_items(user_liked_items), which fits item-based logic. Others do not.user_similarities = {'User1': 0.9, 'User2': 0.8}
user_likes = {'User1': ['ItemA', 'ItemB'], 'User2': ['ItemB', 'ItemC']}
recommend = set()
for user, sim in user_similarities.items():
if sim > 0.85:
recommend.update(user_likes[user])
print(sorted(recommend))user_liked = ['ItemA', 'ItemB']
def find_similar_items(items):
return ['ItemC', 'ItemD']
recommend = find_similar_items(user_liked)
print(recommend)
find_similar_items ignores its input and returns fixed items.Pass the test and this pattern moves unknown