手把手教你用python实现简单商品推荐

2023-12-19 09:14:54 浏览数 (1)


协同过滤算法解释

协同过滤(Collaborative Filtering)算法是一种利用用户历史行为数据和物品属性之间的关系,预测用户对未知物品喜好程度的算法。它基于一个假设,即如果两个用户在过去喜欢的物品相似,那么他们在未来也可能会喜欢相似的物品。

协同过滤算法可以分为两种类型:基于用户的协同过滤和基于物品的协同过滤。

基于用户的协同过滤

基于用户的协同过滤算法是通过对用户历史行为数据进行挖掘,找出具有相似兴趣爱好的用户群体,然后推荐这些用户喜欢的物品给目标用户。具体实现方式是计算目标用户与其他用户之间的相似度,然后选取相似度最高的用户作为邻居,最后根据邻居的评分数据生成推荐列表。

基于物品的协同过滤

基于物品的协同过滤算法是通过对物品属性之间的相似度进行计算,找出具有相似属性的物品,然后将这些物品推荐给目标用户。具体实现方式是计算物品之间的相似度,然后选取相似度最高的物品作为邻居,最后根据邻居的评分数据生成推荐列表。

协同过滤算法在面对大规模数据时,计算相似度矩阵的时间和空间复杂度较高,因此在实际应用中需要采用优化算法,如基于近似矩阵分解的协同过滤算法等。

简单商品推荐运行demo

代码语言:javascript复制
import numpy as np

# 物品相似度计算函数(余弦相似度)
def cosine_similarity(item1, item2):
    mask = np.logical_and(item1 != 0, item2 != 0)  # 只考虑共同被用户评价过的物品
    if np.sum(mask) == 0:  # 如果没有共同被用户评价过的物品,相似度为0
        return 0
    return np.dot(item1, item2) / (np.linalg.norm(item1) * np.linalg.norm(item2))

# 推荐函数
def recommend(user_id, ratings, k=2):
    n_items = ratings.shape[1]
    similarities = np.zeros(n_items)
    for i in range(n_items):
        similarities[i] = cosine_similarity(ratings[:, user_id], ratings[:, i])
    top_k_items = np.argsort(similarities)[-k:]  # 相似度最高的k个物品
    recommendations = np.zeros(n_items)
    for i in top_k_items:
        recommendations[i] = np.sum(ratings[:, i])  # 推荐物品的分数为用户对该物品的评分之和
    return np.argsort(recommendations)[::-1]  # 返回按推荐分数降序排列的物品索引

def main():
    # 创建物品-用户评分矩阵
    ratings = np.array([
        [5, 3, 0, 1],
        [4, 0, 4, 4],
        [1, 1, 3, 2],
        [0, 0, 4, 5],
        [2, 2, 0, 0]
    ])

    user_id = 0
    recommended_items = recommend(user_id, ratings)
    print(f"用户 {user_id} 的推荐物品顺序为:{recommended_items}")

if __name__ == "__main__":
    main()

创建了一个简单的物品-用户评分矩阵 ratings,其中行表示物品,列表示用户,数值表示评分(0表示未评价)。然后定义了物品相似度计算函数 cosine_similarity,使用余弦相似度来计算物品之间的相似度。 通过 recommend 函数来进行推荐。该函数接受用户ID、评分数据和可选参数k(指定要考虑的邻居数量,默认为2),计算用户对各个物品的评分与其他物品的相似度,并选择相似度最高的k个物品作为邻居。然后根据邻居物品的评分计算推荐物品的分数,并返回按分数降序排列的物品索引。

​编辑

难点代码解释

代码语言:javascript复制
# 推荐函数
def recommend(user_id, ratings, k=2):
    n_items = ratings.shape[1]
    similarities = np.zeros(n_items)
    for i in range(n_items):
        similarities[i] = cosine_similarity(ratings[:, user_id], ratings[:, i])
    top_k_items = np.argsort(similarities)[-k:]  # 相似度最高的k个物品
    recommendations = np.zeros(n_items)
    for i in top_k_items:
        recommendations[i] = np.sum(ratings[:, i])  # 推荐物品的分数为用户对该物品的评分之和
    return np.argsort(recommendations)[::-1]  # 返回按推荐分数降序排列的物品索引

推荐函数 recommend 的输入参数为用户ID、评分数据和可选参数k,其中k指定要考虑的邻居数量(即相似度最高的前k个物品)。

  • 函数首先获取评分数据中物品的数量,并初始化一个长度为n_items的零数组 similarities
  • 对于每个物品i,使用 cosine_similarity 函数计算用户对物品i和其他物品的评分之间的余弦相似度,并将结果存储在 similarities 数组中。
  • 根据 similarities 数组找出相似度最高的k个物品的索引,并将其存储在长度为k的数组 top_k_items 中。
  • 对于每个相似度最高的物品i,计算用户对该物品的评分之和作为其推荐分数,并将结果存储在一个长度为n_items的零数组 recommendations 中。
  • recommendations 数组按推荐分数降序排列,并返回按排名排序的物品索引数组。

0 人点赞