076. 编写一个函数,实现简单的推荐系统
在 Python 中,可以使用协同过滤算法来实现一个简单的推荐系统。协同过滤是一种常用的推荐系统技术,它通过分析用户之间的相似性或物品之间的相似性来生成推荐。
示例
假设我们有一个简单的用户-物品评分矩阵,其中用户对物品的评分范围为 1 到 5。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 示例数据:用户-物品评分矩阵
# 用户:A, B, C, D
# 物品:1, 2, 3, 4, 5
ratings = np.array([
[5, 3, 0, 1, 0], # 用户 A
[4, 0, 0, 1, 0], # 用户 B
[1, 1, 0, 5, 0], # 用户 C
[1, 0, 0, 4, 0], # 用户 D
])
# 简单的基于用户协同过滤的推荐系统
def simple_user_based_recommender(ratings, user_index, num_recommendations=2):
"""
基于用户协同过滤的推荐系统
:param ratings: 用户-物品评分矩阵
:param user_index: 目标用户的索引
:param num_recommendations: 推荐物品的数量
:return: 推荐物品的索引列表
"""
# 计算用户之间的相似度(使用余弦相似度)
user_similarity = cosine_similarity(ratings)
# 获取目标用户评分过的物品
user_ratings = ratings[user_index]
rated_items = np.nonzero(user_ratings)[0]
# 计算每个物品的预测评分
predictions = np.zeros(ratings.shape[1])
for item_index in range(ratings.shape[1]):
if item_index in rated_items:
continue # 跳过已经评分过的物品
# 计算预测评分
weighted_sum = 0
similarity_sum = 0
for other_user_index in range(ratings.shape[0]):
if other_user_index == user_index:
continue # 跳过目标用户自身
similarity = user_similarity[user_index, other_user_index]
rating = ratings[other_user_index, item_index]
if rating > 0:
weighted_sum += similarity * rating
similarity_sum += abs(similarity)
if similarity_sum > 0:
predictions[item_index] = weighted_sum / similarity_sum
# 获取推荐物品
recommended_items = np.argsort(-predictions)[:num_recommendations]
return recommended_items
# 示例用法
if __name__ == "__main__":
user_index = 0 # 目标用户索引
num_recommendations = 2 # 推荐物品数量
recommendations = simple_user_based_recommender(ratings, user_index, num_recommendations)
print(f"为用户 {user_index} 推荐的物品索引:{recommendations}")
代码说明
- 用户-物品评分矩阵:使用一个二维数组表示用户对物品的评分。评分范围为 1 到 5,未评分的物品用 0 表示。
- 计算用户相似度:使用
cosine_similarity
计算用户之间的相似度。余弦相似度衡量的是用户评分向量之间的夹角,值越接近 1 表示越相似。 - 预测评分:对于目标用户未评分的物品,根据其他用户的评分和相似度计算预测评分。
- 生成推荐:根据预测评分从高到低排序,选择评分最高的物品作为推荐。
示例输出
为用户 0 推荐的物品索引:[2 4]
注意事项
- 数据稀疏性:在实际应用中,用户-物品评分矩阵通常是稀疏的,即大部分用户只对少量物品进行了评分。这可能会影响相似度计算和预测评分的准确性。
- 相似度计算:除了余弦相似度,还可以使用其他相似度度量,如皮尔逊相关系数等。
- 物品过滤:在生成推荐时,可以过滤掉目标用户已经评分过的物品。
- 性能优化:对于大规模数据集,可以使用矩阵分解等技术来提高推荐系统的性能。
扩展功能
如果你需要更复杂的推荐系统功能,可以考虑以下内容:
基于物品的协同过滤:计算物品之间的相似度,而不是用户之间的相似度。
item_similarity = cosine_similarity(ratings.T)
矩阵分解:使用矩阵分解技术(如 SVD)来处理稀疏数据并提高推荐质量。
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=2)
reduced_ratings = svd.fit_transform(ratings)
混合推荐系统:结合协同过滤和基于内容的推荐,提高推荐的多样性和准确性。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)