前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你用python实现简单商品推荐

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

原创
作者头像
一个风轻云淡
发布2023-12-19 09:14:54
4240
发布2023-12-19 09:14:54
举报
文章被收录于专栏:java学习java

协同过滤算法解释

协同过滤(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 数组按推荐分数降序排列,并返回按排名排序的物品索引数组。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 协同过滤算法解释
  • 简单商品推荐运行demo
  • 难点代码解释
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档