基于用户的推荐系统

推荐系统

  • 意义

    1. 推荐系统是利用电子商务网站向客户提供商品信息和建议,帮助用户决定应该购买什么产品,模拟销售人员帮助客户完成购买过程。个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品。

    2. 随着电子商务规模的不断扩大,商品个数和种类快速增长,顾客需要花费大量的时间才能找到自己想买的商品。这种浏览大量无关的信息和产品过程无疑会使淹没在信息过载问题中的消费者不断流失。

    3. 为了解决这些问题,个性化推荐系统应运而生。个性化推荐系统是建立在海量数据挖掘基础上的一种高级商务智能平台,以帮助电子商务网站为其顾客购物提供完全个性化的决策支持和信息服务。

  • 构成

    1. 用户建模模块
    2. 推荐对象建模模块
    3. 推荐算法模块
  • 推荐算法

    1. 基于内容的推荐算法
    2. 协同过滤推荐
    3. 基于关联规则推荐
    4. 基于知识推荐
    5. 组合推荐
  • 着重讲 协同过滤算法(基于用户的协同过滤)

    1. 购买手机数据 结构如下:

      1,华为p30,2.0
      1,三星s10,5.0
      1,小米9,2.6
      2,华为p30,1.0
      2,vivo,5.0
      2,htc,4.6
      3,魅族,2.0
      3,iphone,5.0
      3,pixel2,2.6
      
    2. 将数据转成字典格式

      {
      	'1': {
      		'华为p30': '2.0',
      		'三星s10': '5.0',
      		'小米9': '2.6'
      	},
      	'2': {
      		'华为p30': '1.0',
      		'vivo': '5.0',
      		'htc': '4.6'
      	},
      	'3': {
      		'魅族': '2.0',
      		'iphone': '5.0',
      		'pixel2': '2.6'
      	}
      }
      
      # 读数据
      content = []
      with open('./phone.txt',encoding='utf-8') as fp:  
          content = fp.readlines()
      
      # 拼结构
      data = {}
      for line in content:
          line = line.strip().split(',')
          #如果字典中没有某位用户,则使用用户ID来创建这位用户
          if not line[0] in data.keys():
              data[line[0]] = {line[1]:line[2]}
              #否则直接添加以该用户ID为key字典中
              else:
                  data[line[0]][line[1]] = line[2]
      
    3. 计算欧式距离 公式为

      from math import *
      def Euclid(user1,user2):
          #取出两位用户购买过的手机和评分
          user1_data=data[user1]
          user2_data=data[user2]
          distance = 0
          #找到两位用户都购买过的手机,并计算欧式距离
          for key in user1_data.keys():
              if key in user2_data.keys():
                  #注意,distance越大表示两者越相似
                  distance = pow(float(user1_data[key])-float(user2_data[key]),2)
       
        return 1/(1+sqrt(distance))#这里返回值越小,相似度越大
      
    4. 计算当前用户和其他用户的相似度,这个我们可以循环比较,并升序排列

      def top_simliar(userID):
          res = []
          for userid in data.keys():
              #排除与自己计算相似度
              if not userid == userID:
                  simliar = Euclid(userID,userid)
                  res.append((userid,simliar)) # (1,0.57)
          res.sort(key=lambda val:val[1])
        return res
      
    5. 获取推荐的信息

      def recommend(user):
          #相似度最高的用户
          top_sim_user = top_simliar(user)[0][0]
          #相似度最高的用户的购买记录
          items = data[top_sim_user]
          recommendations = []
          #筛选出该用户未购买的手机并添加到列表中
          for item in items.keys():
              if item not in data[user].keys():
                  recommendations.append((item,items[item]))
          recommendations.sort(key=lambda val:val[1],reverse=True)#按照评分排序
      
        return recommendations
      
    6. 测试

          print(recommend('1'))
      
    7. 获取推荐的商品信息

          [('vivo', '5.0'), ('htc', '4.6')]
      
posted @ 2020-05-28 08:48  巫小诗  阅读(740)  评论(0编辑  收藏  举报