基于电商平台的个性化推荐与实现的协同过滤

获取用户的浏览记录数组(user_look_list),并将其二值化为长度为good_count+1的数组(user_binaryzation_list)。

遍历所有其他用户的浏览记录,将每个记录也转化为长度为good_count+1的二值数组(look_list_all)。

计算当前用户浏览记录与其他用户浏览记录的相似度(cosine similarity),将相似度最高的用户的浏览记录作为推荐结果。

获取推荐结果中的商品记录(goods_id_set),并返回前5个随机选择的记录(res_list)。

将res_list作为响应数据返回给前端。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先,将user_look_list转化为长度为商品数+1的二值数组(user_binaryzation_list)可以如下实现:

    # 假设商品数为n,user_look_list长度为m
    user_binaryzation_list = [0] * (n + 1) # 初始化长度为n+1的全零列表(多一个位置用来存储用户ID或者其他标识符)
    user_binaryzation_list[0] = user_id # 第一个位置存储用户ID或其他标识符
    for goods_id in user_look_list:
      if goods_id <= n and goods_id >= 1:
        user_binaryzation_list[goods_id] = 1 # 将二值数组中对应商品的位置设置为1
    

    接着,遍历所有其他用户的浏览记录,同样将其转化为长度为商品数+1的二值数组(look_list_all)可以如下实现:

    # 假设所有用户的浏览记录存储在列表all_look_list中,每个用户的浏览记录都是长度为m的列表
    look_list_all = []
    for look_list in all_look_list:
      binaryzation_list = [0] * (n + 1) # 初始化长度为n+1的全零列表
      binaryzation_list[0] = user_id # 第一个位置存储用户ID或其他标识符
      for goods_id in look_list:
        if goods_id <= n and goods_id >= 1:
          binaryzation_list[goods_id] = 1 # 将二值数组中对应商品的位置设置为1
      look_list_all.append(binaryzation_list) # 将该用户的二值数组添加到look_list_all中
    

    接下来,计算当前用户与其他用户的浏览记录的相似度(cosine similarity),并选出相似度最高的用户的浏览记录作为推荐结果。可以如下实现:

    import numpy as np
    
    # 假设当前用户的二值数组为user_binaryzation_list,其他用户的二值数组存储在look_list_all中
    similarity_list = [] # 存储当前用户与其他用户的相似度
    user_vector = np.array(user_binaryzation_list[1:]) # 用户向量,去掉用户ID
    for look_list in look_list_all:
      goods_vector = np.array(look_list[1:]) # 商品向量,去掉用户ID
      similarity = np.dot(user_vector, goods_vector) / (np.linalg.norm(user_vector) * np.linalg.norm(goods_vector)) # 计算余弦相似度
      similarity_list.append(similarity)
    
    max_index = np.argmax(similarity_list) # 获取相似度最高的用户的索引
    recommendation = look_list_all[max_index] # 推荐结果为相似度最高的用户的浏览记录
    

    最后,获取推荐结果中的商品记录(goods_id_set),并随机选择前5个记录(res_list)作为响应数据返回给前端可以如下实现:

    import random
    
    goods_id_set = set()
    for i in range(1, n+1):
      if recommendation[i] == 1:
        goods_id_set.add(i)
    res_list = random.sample(list(goods_id_set), min(5, len(goods_id_set))) # 随机选择前5个记录
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^