import numpy as np
计算用户之间的相似度(这里使用余弦相似度)
def cosine_similarity(user1, user2):
numerator = np.dot(user1, user2)
denominator = np.linalg.norm(user1) * np.linalg.norm(user2)
return numerator / denominator if denominator!= 0 else 0
获取与目标用户最相似的用户
def get_similar_users(target_user, user_item_matrix, top_n=5):
similarities = []
for i, user in enumerate(user_item_matrix):
if i!= target_user:
sim = cosine_similarity(user_item_matrix[target_user], user)
similarities.append((i, sim))
similarities.sort(key=lambda x: x[1], reverse=True)
return similarities[:top_n]
预测目标用户对物品的评分
def predict_rating(target_user, item, user_item_matrix, similar_users):
numerator = 0
denominator = 0
for similar_user, similarity in similar_users:
if user_item_matrix[similar_user][item]!= 0:
numerator += similarity * user_item_matrix[similar_user][item]
denominator += similarity
return numerator / denominator if denominator!= 0 else 0
为目标用户生成推荐列表
def recommend_items(target_user, user_item_matrix, top_n=10):
similar_users = get_similar_users(target_user, user_item_matrix)
item_scores = []
for item in range(user_item_matrix.shape[1]):
if user_item_matrix[target_user][item] == 0:
score = predict_rating(target_user, item, user_item_matrix, similar_users)
item_scores.append((item, score))
item_scores.sort(key=lambda x: x[1], reverse=True)
return item_scores[:top_n]