摘要

本文基于 MovieLens 数据集构造了用户-电影项目评价矩阵,并基于评价矩阵计算两用户间的相似度,取出相似度最高的 N 个用户作为候选用户序列。接着筛选出这 N 个候选用户的高分电影项目且当前用户尚未观看,并根据这高分候选电影项目集合的电影类型,与当前用户所观影的全部电影类型做一个标签共现,预测当前用户对这些高分电影项目的评分,把预测评分最高的 M 个电影项目推荐给当前用户。

关键词:协同过滤;标签共现;电影推荐;Demo 实战验证

MovieLens 是蛮经典的数据集,在验证推荐算法的初期经常会使用到。本文的数据集没有很大,是基于 ml-latest-small(size:1MB)这个超小的数据集来做微型验证的,反正就是验证思路对不对,管它数据集的 size 咋样,对叭!数据集可以去 MovieLens 官网下载,这里就不提供了嘤嘤嘤。

碎碎念

哦对了,本文是给纯小白入门用的,浅浅打代码确实菜的一批,这次的推荐系统算法验证没有用很花哨的程序实现,一行行带小白入门好了,顺带着我也做个总结,为毕业设计中的一个小模块贡献出自己绵薄的力量呜呜呜,这样子一说就感觉自己形象变高大了呢!什么?想了解浅浅的毕业设计是什么?哦,不告诉你,反正浅浅出品,必属精品嘿嘿嘿。好了废话不多说,就开始入门叭。

实战验证

导入第三方库与数据文件

首先是导入一些必备的第三方库:

import numpy as np
import pandas as pd
import csv
import math

NumPy、Pandas、CSV、Math 版本随意,这个没所谓。其实我压根就没觉得 NumPy 要放进去,只是图个方便,顺手就写了。万一有读者想说后续有个去重操作想用 NumPy 搞一搞,这不就方便了嘛。

接着是利用 pd.read_csv() 进行数据的导入,这里用 values.tolist() 就顺手把 dataframe 类型转换成 list 类型了,嗐,我果然是个转换类型小天才,低调低调:

movies=pd.read_csv("movies.csv").values.tolist()
links=pd.read_csv("links.csv").values.tolist()
ratings=pd.read_csv("ratings.csv").values.tolist()
tags=pd.read_csv("tags.csv").values.tolist()

嗷,你们可能对这四个文件很懵逼,来,浅浅让你们开开眼(虽然说可以自行官网下载数据,完了之后再自己看看,让文章更加充实些,我贴一下样本吧)。

数据变量名说明

movies.csv

links.csv

ratings.csv

tags.csv

我对里面表头做个说明:

变量名 含义
movieId 电影编号
title 电影标题
genres 电影类型
imdbId 在 imdb 里的编号(反正我没用到这个)
tmdbId 在 tmdb 里的编号(反正我没用到这个)
userId 用户编号
rating 评分(0.5~5)
timestamp 时间戳(反正我没用到这个)
tags 用户对电影的打标,但我更倾向于类似弹幕(反正我没用到这个)

转换为评价矩阵

但是有上面的数据,看着好像蛮好做的,但是我比较倾向于处理成用户-项目的评价矩阵进行相似性计算,所以,数据处理过程如下:

#产生评价矩阵:movieId=[]#movieId 列表for index in range(len(movies)):movieId.append(movies[index][0])#print(len(movies))这里也是我输出打锚点的地方Q=[]#评价矩阵userRow=[0 for i in range(len(movies)+1)]#userRow 列表是用户评价行,长度为电影数量加一#print(movieId[len(movies)-1])你可以输出看看……userId=[(i+1) for i in range(610)]count = 0 #userId initial
userRow[0]=ratings[0][0]
for index in range(len(ratings)):if count == ratings[index][0]-1:userRow[(movieId.index(ratings[index][6])+1)]=ratings[index][7]elif count != ratings[index][0]-1:count=count+1Q.append(userRow)#添加到评价矩阵 Q 中userRow=[0 for i in range(len(movies)+1)]userRow[0]=ratings[index][0]userRow[(movieId.index(ratings[index][8])+1)]=ratings[index][9]
Q.append(userRow)

我们来分析一下,我当前这个矩阵的大小是 610*9742 那么如果每次打开这个程序都要进行这么一次数据处理,接近六百万次的数据处理能否避免呢?当然可以啦,我直接得到 Q 之后就把它写进一个 Q.csv 的文件里了:

#写入 Q.csv 文件中
with open ("Q.csv","w",newline="") as csvfile:writer = csv.writer(csvfile)writer.writerows(Q)

然后打开 Q.csv 看看,长这样子呢!

篇幅有限,我就不放出整个数据表了,也放不下,反正代码给了,你们自个儿跑就行。

既然已经做了写入,那么每次只需要读取取用即可:

Q=pd.read_csv("Q.csv",header=None).values.tolist()

为了防止发生读取错误吼,可以试着打个锚点输出一下瞅瞅是不是你想要的数据值即可,这个问题很好解决。值得一提的是,这里写入的是一个无表头的 csv 文件,所以要用 header=None

相似度计算

然后就是利用评价矩阵计算相似度了:

def similar(i,j):sum_ij = 0 #求和分子mul_i = 0 #i 项的平方和mul_j = 0 #j 项的平方和for index in range(1,len(i)):#if i[index]!=-1 and j[index]!=-1:sum_ij=sum_ij+i[index]*j[index]mul_i=mul_i+i[index]*i[index]mul_j=mul_j+j[index]*j[index]#print("i:",i[index],",j:",j[index])if mul_i==0 or mul_j==0:sim=0else:sim=sum_ij/(math.sqrt(mul_i)*(math.sqrt(mul_j)))#余弦相似度return sim

想看 sim 是啥的可以自己输出一下,反正也就是 print(sim(i,j)) 这里要注意哈,i,j 都是向量,换句话说都是一个 list。

实现标签共现

然后是获取用户的观影类型频数:

def co_tags(userId):userGenres=[]#观影矩阵(二维)userWatchs=[]#观影类型(一维)frequency=[]#类型频率userList=[]#定义用户行向量(存放电影编号)ListIndex=[]#定义用户电影编号下标for index in range(1,len(Q[userId-1])):if Q[userId-1][index]!=0:userList.append(movies[index-1][0])ListIndex.append(index-1)#下标默认从 0 开始,所以减一#print(len(userList))userMovies=[]#二维#MovieTags=[]#一维#得到用户所有观影的电影类型矩阵for item in range(len(ListIndex)):MovieGenres=movies[ListIndex[item]][11].split("|")userGenres.append(MovieGenres)MovieGenres=[]#for index in range(len(userGenres)):#print(userGenres[index])for i in range(len(userGenres)):for j in range(len(userGenres[i])):if userGenres[i][j] in userWatchs:frequency[userWatchs.index(userGenres[i][j])]+=1#自增else:userWatchs.append(userGenres[i][j])frequency.append(1)#print(userWatchs)#print(frequency)...

点击这里阅读全文

推荐系统实践:基于数据集MovieLens构造简单推荐系统相关推荐

  1. 推荐系统实践读书笔记-01好的推荐系统

    推荐系统实践读书笔记-01好的推荐系统 在研究如何设计推荐系统前,了解什么是好的推荐系统至关重要.只有了解了优秀推荐系统的特征,我们才能在设计推荐系统时根据实际情况进行取舍.本章分3个步骤来回答这个问 ...

  2. 推荐系统实践----基于用户的协同过滤算法(python代码实现书中案例)

    本文参考项亮的<推荐系统实践>中基于用户的协同过滤算法内容.因其中代码实现部分只有片段,又因本人初学,对python还不是很精通,难免头大.故自己实现了其中的代码,将整个过程走了一遍. 1 ...

  3. 推荐系统实践--基于邻域的社会化推荐算法

    本文链接:https://blog.csdn.net/keyue123/article/details/87370575   今年抖音非常火爆和流行,我们在刷抖音的时候,经常会发现给我们刷到自己微信或 ...

  4. 【推荐系统】基于协同过滤的图书推荐系统

    推荐系统一直让我的思绪占据了一段时间,由于我倾向于阅读书籍,因此探索Book Crossing数据集非常吸引人. 在线推荐系统是许多电子商务网站的事情.推荐系统广泛地向最适合其口味和特征的顾客推荐产品 ...

  5. 【推荐系统】基于图嵌入技术的推荐系统长文综述

    |作者:邓月 | 单位:电子科技大学 | 研究方向:图嵌入技术.推荐系统 近几年,基于图嵌入技术的推荐系统已成为一个热门的研究焦点,并将随着图嵌入技术的不断发展而持续.近日发布的<基于图嵌入技术 ...

  6. movielens推荐系统_基于内容推荐(二)

    A content-based movie recommender system using MovieLens tags (用标签构建一个简单的电影推荐系统) 现在有很多电影.如果没有某种推荐系统, ...

  7. 推荐系统实践(五)----基于图的推荐算法

      基于图的模型(graph−basedmodelgraph-based modelgraph−basedmodel)是推荐系统中的重要内容.在研究基于图的模型之前,首先需要将用户行为数据表示成图的形 ...

  8. 协同过滤算法的简单理解《推荐系统实践》

    协同过滤算法的简单理解 本文主要是讲解一下<推荐系统实践>中UserCF和ItemCF这两种基于领域的推荐算法,写出自己的理解. UserCF(基于用户的协同过滤算法) 这种推荐算法的出发 ...

  9. 推荐系统实践(二)----基于物品的协同过滤算法(ItemCF)

      上一篇博客我简单讲了一下基于用户的协同过滤算法,这里我们一起来学习一下另一种:基于物品的协同过滤算法.基于物品的协同过滤算法是目前业界应用最多的算法,亚马逊.Netflix.Hulu.YouTub ...

  10. 基于 PAI 搭建企业级个性化推荐系统 最佳实践

    场景描述 本方案结合阿里云 PAI 团队预置的基础版算法方案为例,演示如何以阿里云提供的数据.AI 类产品为基础,离线部分采用Maxcompute&Dataworks&PAI的大数据& ...

最新文章

  1. 前阿里程序员吐槽女友败家:开酒店必须400元起步,工资只有自己的1/3
  2. MySQL创建索引(CREATE INDEX)
  3. centos6.5 tar安装mysql_centos6.6安装mysql5.7.9tar包
  4. local service system账户_systemd.service学习和使用总结
  5. 天猫双11倒计时:80000瓶1499元53度飞天茅台将开放限量抢购
  6. 数据结构 红黑树(RBTree)的原理与实现
  7. 二分函数lower_bound()
  8. 学习进度(2016.4.10)
  9. 免费内网映射外网绑定,tcp端口转发(windows)
  10. 变色龙引导启动看不到Mac分区盘符的解决办法
  11. 网易云桌面歌词好看的配色方案
  12. 守望先锋--颜色参数
  13. Unity中Text中首行缩进两个字符和换行的代码
  14. 搜狗推送工具只搜狗快速收录方法点解
  15. 节点精灵 控制循环时间
  16. 鸿蒙天钟小白图片,果然又一令人震惊的取名方式-“小白”
  17. 罗格斯的计算机科学博士奖学金,罗格斯大学cs
  18. 09——规范数据库设计
  19. 最简单DIY基于ESP32CAM的物联网相机系统⑥(用上位机VS2013 MFC实现WIFI图传)
  20. redis之sadd、srem、spop、sdiff、sdiffstore、sinter、 sinterstore、sunion、sunionstore、smove、scard、sismember

热门文章

  1. ios android 宏,iOS常用宏(不断更新)
  2. Ardusub源码解析学习(二)——电机库
  3. 苹果cmsv10仿片库网PC+WAP美化高端免费自适应模板
  4. 为何腾讯一直在推广“低配版”的QQ
  5. php去除空格函数,php如何清除空格
  6. CCNA学习指南第三章
  7. asp mysql 留言本_手把手教你设计ASP+ACCESS留言本
  8. vc2005运行库彻底卸载_VC2005运行库-解决方案
  9. 22年国内最牛的Java面试八股文合集(全彩版),不接受反驳
  10. 字节高工强推 “Android学习视频教程631部,文末有链接哦”