movielens推荐系统_浅谈推荐系统+3个小时上手python实现(完整代码)
已经9012年了应该也不需要我解释什么是推荐系统,大致就像头图一样,挖掘用户的喜好,精准的推送给用户ta想要的东西!推荐系统可以说是无处不在了,电商的猜你喜欢,浏览器右侧的推送消息,包括搜索结果的排序,广义来说都算推荐系统的一部分。而且据听说(没错,是听说的,因为没有找到切实的数据来源),推荐系统给亚马逊带来了35%的销售收入,给Netflix带来了高达75%的消费,并且Youtube主页上60%的浏览来自推荐服务。推荐系统的重要性可见一斑! 同志们必须要学起来辽!
因为目标是让在座的各位一天就可以用Python先上手一波推荐系统,所以这篇也只是浅谈和概括推荐系统的相关知识啦!
目的是一切action的驱动力!
推荐系统的目的是:
- 帮助用户快速找到想要的商品,提高用户对网站的忠诚度;
- 提高网站交叉销售能力、成交转化率;
表现形式:
- Browsing : 推荐系统根据查询返回高质量的推荐;
- Similar Item : 根据相似物品推荐;
- Email : 通过邮件推送感兴趣的商品 (亚马逊);
- Top-N : 推送最可能吸引用户的商品;
- Order-Search Results : 搜索结果按照兴趣排列;
技术:
- People-to-People correlation 协同过滤
2. Item-to-Item 根据产品推荐相关产品
3. Based on 用户基础信息
4. 关联规则挖掘
......... 还有很多算法技术,先不做累述,直接上手协同过滤欧式距离算法。
协同过滤算法解析:
协同过滤中的“同”代表要找出有共同经验的群体;
为特定用户找到他真正感兴趣的内容的好方法是,首先找到与此用户有相似兴趣的其他用户,然后将他们感兴趣的内容推荐给此用户。
现在我们的目标是为User1找到可推荐的电影。
梳理步骤:
- 首先,找到User1 喜欢的电影;
- 找出与User1具有相同的电影兴趣爱好的人群;
- 找出该人群喜欢的其他电影;
- 将这些电影推送给User1。
(一)、首先想象我们要这样一个表格:
横坐标,假设有10w部电影,所以横坐标有10w个movie_id,数据来源自数据库
纵坐标,假设有100w个用户,所以纵坐标有100w个user_id,数据也来自数据库
交叉处,“1”代表用户喜爱这部电影,数据来自日志(例如浏览过,查找过,点赞过,)
"空白"代表用户不喜爱这部电影,因为没有任何浏览日志
(二)、找到用户A(user_id_1)的兴趣爱好
(三)、找到与用户A(user_id_1)具有相同电影兴趣爱好的用户群体集合Set<user_id>
(四)、 找到该群体喜欢的电影集合Set<movie_id>
(五)、未来用户(use_id_1)来访问网站时,要推荐电影{..., m10000}给ta。
Python 实现步骤
第一步:计算两者之间的相似度
a.曼哈顿距离计算(计算迅速,节省时间)
b.欧氏距离计算(计算两个点之间的直线距离) 本文采用欧式距离
数据我已备好,是一个有关movie 的数据集,数据包含138,000 个用户对27,000 个电影的评价,评价分为0-5,数据集详细介绍点击MovieLens。
点击下面链接获取数据,解压,读入Python
数据 ranking : ml-latest-small(1MB):
http://files.grouplens.org/datasets/movielens/ml-latest-small.zipfiles.grouplens.org
数据movies: ml-latest(234.2MB):
http://files.grouplens.org/datasets/movielens/ml-latest.zipfiles.grouplens.org
数据格式如下:
pip
movies = pd.read_csv('Desktop/movies.csv')
print(movie.head(5))
合并两个数据集,通过匹配movie_id
data = pd.merge(movies,ratings,on = 'movieId')
print(data.head(5))
data[['userId','rating','movieId','title']].sort_values('userId').to_csv('Desktop/data.csv',index=False)
# 将合并后的数据集输出保存到桌面 以备后续分析
files = pd.read_csv('Desktop/data.csv')
print(file.head(5))
采用python字典来表示每位用户评论的电影和评分
# 逐行读取刚刚合并并保存的数据集
content = []
with open('Desktop/data.csv') as fp: content = fp.readlines()# 将用户、评分、和电影写入字典data
data = {}
for line in content[1:100]:line = line.strip().split(',')#如果字典中没有某位用户,则使用用户ID来创建这位用户if not line[0] in data.keys():data[line[0]] = {line[3]:line[1]}#否则直接添加以该用户ID为key字典中else:data[line[0]][line[3]] = line[1]data
计算任何两位用户之间的相似度,由于每位用户评论的电影不完全一样,所以首先要找到两位用户共同评论过的电影
然后计算两者之间的欧式距离,最后算出两者之间的相似度。
from math import *
def Euclidean(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 top10_simliar(userID):res = []for userid in data.keys():#排除与自己计算相似度if not userid == userID:simliar = Euclidean(userID,userid)res.append((userid,simliar))res.sort(key=lambda val:val[1])return res[:4]RES = top10_simliar('1')
print(RES)
# 用户之间相似度结果:0表示两位的影评几乎一样,1表示没有共同的影评
根据相似度来推荐用户:
def recommend(user):#相似度最高的用户top_sim_user = top10_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)#按照评分排序#返回评分最高的10部电影return recommendations[:10]Recommendations = recommend('1')
print(Recommendations)
好了,简版推荐系统结束。
但是我们需要不断完善这个推荐系统,例如,我们使用两个用户对相同电影的评分来计算相似度其实不够准确,因为两个用户的评价标准不同,有的人对电影评价整体偏高(认为最差的也能给到3.5分),有的人对电影评价偏低(认为最好的电影也只给3.5分),所以在计算的过程中,应该分别减去两个用户对电影的整体评分,以修正相似度。下期更~
movielens推荐系统_浅谈推荐系统+3个小时上手python实现(完整代码)相关推荐
- java实现踢下线用户_浅谈踢人下线的设计思路!(附代码实现方案)
前言 前两天写了一篇文章,主要讲了下java中如何实现踢人下线,原文连接:java中如何踢人下线?封禁某个帐号后使其会话当即掉线!前端 原本只是简单阐述一下踢人下线的业务场景和实现方案,没想到引出那么 ...
- 《计算机辅助教学及应用实践研究》,《论文_浅谈计算机辅助教学(定稿)》
<论文_浅谈计算机辅助教学(定稿)> (3页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 摘要:计算机辅助教学中要用到多媒体课件 ...
- python判断两个对象是否为相等使用的运算符是_Python入门_浅谈逻辑判断与运算符...
这是关于Python的第6篇文章,主要介绍下逻辑判断与运算符. (一) 逻辑判断: 如果要实现一个复杂的功能程序,逻辑判断必不可少.逻辑判断的最基本标准:布尔类型. 布尔类型只有两个值:True和Fa ...
- html代码id,浅谈html中id和name的区别实例代码
浅谈html中id和name的区别实例代码 更新时间:2008年07月28日 23:00:55 作者: 这个是form里面的name与id的区别 我们可以通过一段代码来分析一下其中的微妙差别: 在 ...
- python sys模块作用_浅谈Python中的模块
模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...
- python的re2和re区别_浅谈Python中re.match()和re.search()的使用及区别
1.re.match()fvk免费资源网 re.match()的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None.fvk免费资源网 包含的参数如下: ...
- python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式
本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...
- swift 引用其他类_浅谈swift中闭包修饰符 weak?unowned? 或什么都不用
浅谈swift中闭包修饰符 weak?unowned? 或什么都不用 平常的开发中,clourse是我们iOSr绕不过去的坎儿. 苹果本身也很重视闭包,像之前的一些老的target-action类型的 ...
- python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名
搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...
最新文章
- 一阶和二阶微分方程的物理意义???
- MYSQL连接字符串参数详细解析(大全参考)
- UpdatePanel Repeater内LinkButton造成页面刷新问题
- 提高Java的锁性能
- react如何在父组件中调用子组件事件
- 菜鸟学习C++练笔之整理搜狗2008版语料库--获取分类语料库
- 在互联网时代如何工作得更简单
- 程序员得到的报酬与他们的生产力不成正比
- 使用Underscore.js的template将Backbone.js的js代码和html代码分离
- 处理非window设置为window的Owner
- 简明人体结构(一):人体结构学习方式的整体引导
- 在Python中如何优雅地处理PDF文件
- 进销存excel_Excel进销存管理套表,自动库存显示应收应付,全函数快捷轻松
- 用jq实现轮播图片的效果
- linux让别人电脑蓝屏,教你如何让别人电脑瞬间蓝屏!只需要两个键,装逼神器,值得拥有...
- STM32(3):番外篇之STM32名字解析
- 机器学习笔记(八):强化学习
- thinkadmin 各种回调的使用
- php 月份英文,所有月份的英语单词
- 解决coursera可以登录但无法播放视频