使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_136
时至2020年,个性化推荐可谓风生水起,Youtube,Netflix,甚至于Pornhub,这些在互联网上叱咤风云的流媒体大鳄无一不靠推荐系统吸引流量变现,一些电商系统也纷纷利用精准推荐来获利,比如Amzon和Shopfiy等等,精准推荐用事实告诉我们,流媒体和商品不仅仅以内容的传播,它还能是一种交流沟通的方式。
那么如何使用python语法构造一套属于我们自己的推荐系统呢,这里推荐协同过滤算法,它隶属于启发式推荐算法(Memory-based algorithms),这种推荐算法易于实现,并且推荐结果的可解释性强,其中我们使用基于用户的协同过滤(User-based collaborative filtering):主要考虑的是用户和用户之间的相似度,只要找出相似用户喜欢的物品,并预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户。举个例子,李老师和闫老师拥有相似的电影喜好,当新电影上映后,李老师对其表示喜欢,那么就能将这部电影推荐给闫老师。
说白了就是利用商品作为纽带,判断高相似度的用户之间互相没有买过的商品,然后将其排序推荐。
假设我们是一个在线手机平台,有一些用户的购买数据和打分记录
phone.txt
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
用户1买了华为三星和小米三款手机,而用户而买了华为,vio,htc这三款,其中用户1和用户2的相同点是都买过华为手机,我们认为此二人具有一定的相似度,而用户3买的手机则完全不一样,所以用户3的存在可以理解为一种检查机制,用来验证推荐系统的可用性,因为以用户3的购买记录来看,理论上不应该将用户3的手机推荐给用户1和2,反过来用户1和用户2买过的手机也不会推荐给拥护3
第一步,将数据读取并格式化为字典形式,便于解析:
content = \[\]
with open('./phone.txt') as fp:
content = fp.readlines()
# 将用户、评分、和手机写入字典data
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\]
第二步,计算两个用户之间的相似度,这里使用欧几里得距离(欧式距离)
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))#这里返回值越小,相似度越大
第三步,计算当前用户和其他所有用户的相似度,因为用户可能成千上万,我们只需要那一个和当前用户极为相似的真命天子
#计算某个用户与其他用户的相似度
def top\_simliar(userID):
res = \[\]
for userid in data.keys():
#排除与自己计算相似度
if not userid == userID:
simliar = Euclid(userID,userid)
res.append((userid,simliar))
res.sort(key=lambda val:val\[1\])
return res
最后一步,进行推荐推送:
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
最后运行测试
print(recommend('1'))
\[('vivo', '5.0'), ('htc', '4.6')\]
将vivo和htc手机按照评分倒序推荐给了用户1,符合我们的基本逻辑
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_136
使用Python3.7配合协同过滤算法(base on user,基于人)构建一套简单的精准推荐系统(个性化推荐)的更多相关文章
- 【机器学习笔记一】协同过滤算法 - ALS
参考资料 [1]<Spark MLlib 机器学习实践> [2]http://blog.csdn.net/u011239443/article/details/51752904 [3]线性 ...
- Spark 基于物品的协同过滤算法实现
J由于 Spark MLlib 中协同过滤算法只提供了基于模型的协同过滤算法,在网上也没有找到有很好的实现,所以尝试自己实现基于物品的协同过滤算法(使用余弦相似度距离) 算法介绍 基于物品的协同过滤算 ...
- 基于Python协同过滤算法的认识
Contents 1. 协同过滤的简介 2. 协同过滤的核心 3. 协同过滤的实现 4. 协同过滤的应用 1. 协同过滤的简介 关于协同过滤的一个最经典的例子就是看电影,有时候 ...
- CF(协同过滤算法)
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- Slope one—个性化推荐中最简洁的协同过滤算法
Slope One 是一系列应用于 协同过滤的算法的统称.由 Daniel Lemire和Anna Maclachlan于2005年发表的论文中提出. [1]有争议的是,该算法堪称基于项目评价的non ...
- 机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用. 推荐的背后逻辑 有没有思考过一个问题,当我们在淘宝或者是 ...
- SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高
1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为:
- GBDT(Gradient Boosting Decision Tree)算法&协同过滤算法
GBDT(Gradient Boosting Decision Tree)算法参考:http://blog.csdn.net/dark_scope/article/details/24863289 理 ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
随机推荐
- 对象、Map、Set、WeakMap、WeakSet
对象.Map.Set.WeakMap.WeakSet 本文写于 2020 年 11 月 24 日 总的来说,Set 和 Map 主要的应用场景分别在于数据重组和数据储存.Set 是一种叫做「集合」的数 ...
- c++动态内存分配需要注意的地方,可以不用尽量不用
在实际开发中,需要动态分配内存的场景极少,string和vector已经足够方便,如果不是非用不可的情况,采用动态分配内存就是给自己挖坑. 如果应用开发中一定要用动态内存分配技术,建议把它封装在类中, ...
- 手把手教你 bash中给变量赋值时 ' 和 " 和 ` 和 $() 的使用
1.赋值指令 var='变量内容' var="变量内容" var=`command` var=$(command) var=变量内容 2.格式要求 =两边不能有空白字符 错误示例 ...
- 课堂测试——HDFS操作
要求: 编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务: 向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件: ...
- Python数据分析--Numpy常用函数介绍(5)--Numpy中的相关性函数
摘要:NumPy中包含大量的函数,这些函数的设计初衷是能更方便地使用,掌握解这些函数,可以提升自己的工作效率.这些函数包括数组元素的选取和多项式运算等.下面通过实例进行详细了解. 前述通过对某公司股票 ...
- JAVA 异常 基本知识
异常 异常定义 异常是运行过程中出现的错误 人为错误:填写错误等 随机错误:网络中断.内存耗尽等 一个健壮的程序必须处理各种各样的错误 Java的异常是class Object Throwable E ...
- 掘地三尺搞定 Redis 与 MySQL 数据一致性问题
Redis 拥有高性能的数据读写功能,被我们广泛用在缓存场景,一是能提高业务系统的性能,二是为数据库抵挡了高并发的流量请求,点我 -> 解密 Redis 为什么这么快的秘密. 把 Redis 作 ...
- Vue路由的模块自动化与统一加载
首先呢,我们来看看一般项目路由是怎么划分的. 为什么这么划分呢?如果大项目业务非常多,单纯的单页面很难维护,我们只有这样规范化,才能高效率. 模块自动化与统一加载的好处: 规范化命名(模块名.业务名. ...
- UiPath录制器的介绍和使用
一.录制器(Recording)的介绍 录制器是UiPath Studio的重要组成部分,可以帮助您在自动化业务流程时节省大量时间.此功能使您可以轻松地在屏幕上捕获用户的动作并将其转换为序列. 二.录 ...
- 又拍云 Redis 的改进之路
作为推出国内首创可编程 CDN 服务的专业云服务提供商,又拍云利用 CDN 边缘网络规模和性能,允许客户自定义编写规则来满足常用业务场景.而为了保证这些源数据,如边缘重定向.请求限速.自定义错误页面. ...