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}")