movielens电影推荐

现在几种主流的推荐引擎技术包括:
近邻算法推荐引擎:基于用户的协同过滤和基于项目的协同过滤;
个性化推荐引擎:基于内容的推荐引擎和情境感知推荐引擎;
基于模型的推荐引擎:基于机器学习的推荐引擎、分类模型-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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容