编写基于用户相似度的协同过滤推荐算法,并为代码添加注释
时间: 2024-10-10 16:12:02 浏览: 31
基于用户相似性的协同过滤推荐算法是一种常用于个性化推荐的经典技术,它假设如果两个用户对某些项目有相似的喜好,那么他们对未评价项目的喜好也可能相近。以下是Python中基于皮尔逊相关系数的简单用户-物品评分矩阵的相似度计算和推荐的基本步骤:
```python
import numpy as np
# 定义一个示例用户-物品评分矩阵
# user_ratings是一个二维数组,行代表用户,列表示物品评分
user_ratings = np.array([[4, 5, 3], [5, 3, 4], [2, 1, 5]])
# 计算用户之间的相似度
def calculate_similarity(user_ratings):
# 对角线元素设为0,因为用户自己不能与自己比较
user_ratings[user_ratings == user_ratings.diagonal()] = 0
# 计算皮尔逊相关系数,范围从-1到1,1表示完全正相关,-1表示完全负相关
similarity_matrix = np.dot(user_ratings.T, user_ratings) / (np.outer(np.sum(user_ratings, axis=1), np.sum(user_ratings, axis=0)) - np.square(user_ratings).sum(axis=1).reshape(-1, 1))
# 归一化相似度矩阵,使得每个用户之间的相似度之和等于1
similarity_matrix /= np.sum(similarity_matrix, axis=1, keepdims=True)
return similarity_matrix
# 获取最相似的用户
def get_similar_users(user_id, similarity_matrix):
similar_users = np.argsort(-similarity_matrix[user_id])[:-1] # 取相似度最高的几个用户
return similar_users
# 根据相似用户的喜好预测目标用户对未知项目的评分
def predict_ratings(target_user_id, similarity_matrix, user_ratings):
similar_users_ids = get_similar_users(target_user_id, similarity_matrix)
mean_scores = np.mean(user_ratings[similar_users_ids, :], axis=0)
return mean_scores
# 示例
target_user_id = 0 # 目标用户
predicted_ratings = predict_ratings(target_user_id, calculate_similarity(user_ratings), user_ratings)
# 打印预测评分
print(f"目标用户{target_user_id}可能对未评级物品的评分预测:", predicted_ratings)
#
阅读全文