现在几种主流的推荐引擎技术包括:
近邻算法推荐引擎:基于用户的协同过滤和基于项目的协同过滤;
个性化推荐引擎:基于内容的推荐引擎和情境感知推荐引擎;
基于模型的推荐引擎:基于机器学习的推荐引擎、分类模型-SVM/KNN、矩阵分解、奇异值分解、交替最小二乘法概述、混合推荐引擎。
基于近邻算法的推荐系统认为相同或相似用户的喜好相近,使用这种方式对活跃用户进行推荐。这种基于近邻算法的推荐思想设定是非常简单的:根据某一个给定的用户评级,寻找所有相似用户的历史喜好信息,根据这些活跃用户的历史信息对所有未知产品做出预测,对没有评级过该商品的用户根据近邻原则进行推荐猜测。
这一方法是基于以下假设:
1、在过去有相似偏好的人在未来也有相似的偏好
2、人们的偏好在未来的时间里将保持稳定和一致。
协同过滤系统有两种类型:
1、基于用户的协同过滤
2、基于项目的协同过滤
基于用户的协同过滤系统的基本判断思想是过去具有相似口味的人,在将来也会喜欢类似的物品。例如,如果用户A和用户B有非常相似的购物历史,当用户A购买了一本用户B还没有看过的新书,就可以将这本新书推荐给用户B,因为他们有相似的品味。
基于项目的协同过滤推荐系统与基于用户的协同过滤不同,它使用项目之间的相似度而不是用户之间的相似度。
近邻算法只有当有用户的商品交互信息时才能工作,比如评级、喜欢/不喜欢、看过/没看过等。与基于内容的推荐不同,它不考虑任何产品特征或用户对产品的个人偏好信息。
临近算法有它自身的弱点和局限性,比如对已有数据过于依赖造成的冷启动问题,即它们无法实现向新用户 ( 指未对商品等进行过任何评价的用户 ) 进行商品推荐,也无法向用户推荐没有评级的新商品。当用户对产品的评级很少时,这些推荐系统无法处理这类数据十分稀疏的情形。
协同过滤算法
协同过滤算法是一种较为著名和常用的推荐算法,它基于对用户历史行为数据的挖掘发现用户的喜好偏向,并预测用户可能喜好的产品进行推荐。也就是常见的“猜你喜欢”,和“购买了该商品的人也喜欢”等功能。它的主要实现由:
●根据和你有共同喜好的人给你推荐
●根据你喜欢的物品给你推荐相似物品
●根据以上条件综合推荐
因此可以得出常用的协同过滤算法分为两种,基于用户的协同过滤算法(user-based collaboratIve filtering),以及基于物品的协同过滤算法(item-based collaborative filtering)。特点可以概括为“人以类聚,物以群分”,并据此进行预测和推荐。
后来出现了基于内容的推荐系统。基于内容的推荐系统是根据用户的之前的偏好,计算推荐项目中与用户偏好相似度最高的项目,推荐给用户。
基于内容的推荐系统解决了很多协同过滤中的缺点,但其自身也有固有的缺点,比如新发现,换句话说,就是不能在用户的偏好范围之外进行新项目的推荐,但这个问题协同过滤却可以解决。
以下是基于用户的协同过滤的电影推荐:
需满足的条件:
1、一个与该应用有过互动的用户集合
2、一个所有可用电影的目录
3、每位用户对电影的评级
不是所有的用户对所有电影都进行了评级,但是未评级的电影作品只占少数。
一、数据整理
读入我们所需的数据
data = {}
file = open("data.csv", 'r',encoding='UTF-8')
for line in file.readlines():
line = line.strip().split(',')
if not line[0] in data.keys():
data[line[0]] = {line[3]: line[1]}
else:
data[line[0]][line[3]] = line[1]
选取数据文件data中的用户“1”作为此次电影推荐的目标用户
user1_data = data['1']#“1”的电影和评分
二、用户相似度计算
为目标用户找到相似的用户,然后向目标用户推荐其还没有看过但是与其相似用户已经看过的电影。
利用电影评级信息计算用户之间的相似度。
res = []#用于记录目标用户与其他用户的相似度数据
for userid in data.keys():#计算“1”与其他用户相似度
if not userid == '1':#要排除“1”的数据
user1_data = data['1']#“1”的电影和评分
user2_data = data[userid]#其他用户的电影和评分
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)
simliar = 1 / (1 + sqrt(distance))#simliar值越小,相似度越大
注:由于我们选取了data数据集中的用户“1”作为目标用户,因此这里需把目标用户从其他用户中排除。
用户之间的相似度可以通过用户给定的电影评级进行计算。计算相似度最常用的方法有欧氏距离与皮尔逊相关系数。
在此处采用欧氏距离来计算用户相似度。利用如下公式:找到与目标用户相似度最高的用户
res.append((userid, simliar))#记录目标用户与其他用户的相似度数据
res.sort(key=lambda val: val[1])#将res内的数据按照相似度从小到大进行排序
print(res)
三、推荐电影
根据上面所计算的用户相似度找到与目标用户相似度最高的用户。
从相似度最高的用户的观影记录中筛选出目标用户未观看的电影并添加到列表中,按照评分排序找到评分最高的10部电影。
#根据相似度来推荐用户
top_sim_user = res[0][0]
items = data[top_sim_user]# 相似度最高的用户的观影记录
recommendations = []
for item in items.keys():# 筛选出该用户未观看的电影并添加到列表中
if item not in data['1'].keys():
recommendations.append((item, items[item]))
recommendations.sort(key=lambda val: val[1], reverse=True) # 按照评分排序
print(recommendations[:10])# 返回评分最高的10部电影
最后,可以得到结果:
四、总结
临近算法有它自身的弱点和局限性,比如对已有数据过于依赖造成的冷启动问题,即它们无法实现向新用户 ( 指未对商品等进行过任何评价的用户 ) 进行商品推荐,也无法向用户推荐没有评级的新商品。当用户对产品的评级很少时,这些推荐系统无法处理这类数据十分稀疏的情形。
基于内容的推荐系统解决了很多协同过滤中的缺点,但其自身也有固有的缺点,比如新发现,换句话说,就是不能在用户的偏好范围之外进行新项目的推荐,但这个问题协同过滤却可以解决。
在实际应用中推荐混合推荐模型,这种模型比任一单个模型都更加强大。
代码文件:https://gitee.com/youngyr/Python/tree/master/%E5%90%B4%E6%81%A9%E8%BE%BE%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0