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. 用户-物品评分矩阵:使用一个二维数组表示用户对物品的评分。评分范围为 1 到 5,未评分的物品用 0 表示。
  2. 计算用户相似度:使用 cosine_similarity 计算用户之间的相似度。余弦相似度衡量的是用户评分向量之间的夹角,值越接近 1 表示越相似。
  3. 预测评分:对于目标用户未评分的物品,根据其他用户的评分和相似度计算预测评分。
  4. 生成推荐:根据预测评分从高到低排序,选择评分最高的物品作为推荐。

示例输出

为用户 0 推荐的物品索引:[2 4]

注意事项

  1. 数据稀疏性:在实际应用中,用户-物品评分矩阵通常是稀疏的,即大部分用户只对少量物品进行了评分。这可能会影响相似度计算和预测评分的准确性。
  2. 相似度计算:除了余弦相似度,还可以使用其他相似度度量,如皮尔逊相关系数等。
  3. 物品过滤:在生成推荐时,可以过滤掉目标用户已经评分过的物品。
  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)