traininglxl

推荐系统概述(个性化推荐)

核心:通过发现数据集中的模式,为用户提供与之最为相关的信息。

1.从一个例子出发

​ 两名用户都在某电商网站购买了A、B两种产品。当他们产生购买这个动作的时候,两名用户之间的相似度便被计算了出来。其中一名用户除了购买了产品A和B,还购买了C产品,此时推荐系统会根据两名用户之间的相似度会为另一名用户推荐项目C。

2.应用现状

​ 推荐系统可以说是无处不在了,比如:电商的猜你喜欢,浏览器右侧的推送消息,包括搜索结果的排序,广义来说都算推荐系统的一部分。目前推荐系统给亚马逊带来了35%的销售收入,给Netflix带来了高达75%的消费,并且Youtube主页上60%的浏览来自推荐服务。

音乐软件如Spotify及Deezer也使用推荐系统进行音乐推荐。

3.推荐算法

协同过滤的推荐又可以分为两类:

  1. 启发式推荐算法(Merhory-based algorithms)
    启发式推荐算法易于实现,并且推荐结果的可解释性强。启发式推荐算法又可以分为两类:
    • 基于用户的协同过滤(User-based collaborative filtering):主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。举个例子,李老师和闫老师拥有相似的电影喜好,当新电影上映后,李老师对其表示喜欢,那么就能将这部电影推荐给闫老师。
    • 基于物品的协同过滤(ltem-based collaborative filtering):主要考虑的是物品和物品之间的相似度,只有找到了目标用户对某些物品的评分,那么就可以对相似度高的类似物品进行预测,将评分最高的若干个相似物品推荐给用户。举个例子,如果用户A、B、C给书籍X、Y的评分都是5分,当用户D想要买Y书籍的时候,系统会为他推荐X书籍,因为基于用户A、B、C的评分,系统会认为喜欢Y书籍的人在很大程度上会喜欢X书籍。
  2. 基于模型的推荐算法(Model-based algorithms)
    基于模型的推荐算法利用矩阵分解,有效的缓解了数据稀疏性的问题。矩阵分解是一种降低维度的方法,对特征进行提取,提高推荐准确度。基于模型的方法包括决策树、基于规则的模型、贝叶斯方法和潜在因素模型。
    推荐框架:tensorflow pytorch

4.推荐系统的目的

  1. 帮助用户快速找到想要的商品,提高用户对网站的忠诚度;
  2. 提高网站交叉销售能力、成交转换率;

5.简单推荐算法的设计思路

​ 首先,找到User1喜欢的商品;找出与User1具有相同的商品兴趣爱好的人群;找出该人群喜欢的其他商品;将这些商品推送给User1。

  • 难点1:如何获取兴趣相似的用户
    • 思路:通过购买过相同商品为介质,关联用户的关系
  • 难点2:计算相似度
    • 曼哈顿距离计算
    • 欧氏距离计算(计算两个点之间的直线距离)
import math
# 计算两点之间的距离
def EucliDist(A,B):
	return math.sqrt(sum([(a - b)**2 for (a,b) in zip(A,B)]))

X = [1,2,3,4]
Y = [0,1,2,3]
print(EucliDist(X,Y))

6.基于用户的协同过滤推荐系统

使用Python3.7配合协同过滤算法构建一套简单的精准推荐系统。

假设我们是一个手机销售的电商平台,有一些用户的购买数据和打分记录如下(phone.txt):

1,诺基亚1100,4.8
1,iphone11,5.0
1,联想g7,3.0
2,诺基亚1100,3.0
2,vivo,5.0
2,htc,0.2
3,锤子t1,0.1
3,魅族h11,0.3
3,pixel2,4.9

Step1:将数据读取并格式化为字典形式,便于解析

# 读取数据集
content = []
with open(\'./phone.txt\',\'r+\',encoding=\'utf-8\') as fp:
    content = fp.readlines()
    
# 格式化数据列表
data = {}
for line in content:
    line = line.strip().replace("\n",\'\').split(\',\')
    # 数据格式:line = [\'1\',\'诺基亚1100\',\'4.8\']
    if not line[0] in data.keys():
        data[line[0]] = {line[1]:line[2]}
    else:
        data[line[0]][line[1]] = line[2]
print(data)
"""数据字典
{
    \'1\': 
	{
		\'诺基亚1100\': \'4.8\', 
		\'iphone11\': \'5.0\', 
		\'联想g7\': \'3.0\'
        }, 
    \'2\': 
    	{
    		\'诺基亚1100\': \'3.0\', 
    		\'vivo\': \'5.0\', 
    		\'htc\': \'0.2\'
    	}, 
    \'3\': 
    	{
    		\'锤子t1\': \'0.1\', 
    		\'魅族h11\': \'0.3\', 
    		\'pixel2\': \'4.9\'
    	}
}
"""

Step 2:计算两个用户之间的相似度,这里使用欧几里得距离

# 计算用户相似度
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 += pow(float(user1_data[key])-float(user2_data[key]),2)
    if distance == 0:
        distance = float(\'inf\')
    return 1/(1+sqrt(distance))

Step 3:计算当前用户和其他所有用户的相似度

# 计算某个用户和其他用户相似度比较
def top_simliar(user):

    res = []
    for userid in data.keys():
        # 排除当前用户
        if not userid == user:
            simliar = Euclid(user,userid)
            res.append((userid,simliar))

    res.sort(key=lambda val:val[1],reverse=True)
    return res

Step 4:进行推荐推送

# 快速推荐方法
def recommend(user):
    # 先取一个相似度最高的用户
    top_user = top_simliar(user)[0][0]
    # 相似度最高的购买记录
    items = data[top_user]
    # 推荐列表
    recommend_list = []
    for item in items.keys():
        if item not in data[user].keys():
            recommend_list.append((item,items[item]))
    # 排序,多个商品按照评分排序
    recommend_list.sort(key=lambda val:val[1],reverse=True)

    return recommend_list[:10]

Step 5:推荐测试

# 对用户\'1\'进行推荐
print(recommend(\'1\'))
# 输出结果:[(\'vivo\', \'5.0\'), (\'htc\', \'0.2\')]
# 将vivo和htc手机按照评分倒序推荐给了用户1

分类:

技术点:

相关文章: