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

2023-05-16

摘要

本文基于 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+1
        Q.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=0
    else:
        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)
	...

点击这里阅读全文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Acrobat DC 常用快捷键

    参考 xff1a https helpx adobe com cn acrobat using keyboard shortcuts html 动作快捷键下一页向右键或 Ctrl 43 Page Down上一页向左键或 Ctrl 43 Pa
  • 用Python爬取淘宝网商品信息

    用Python爬取淘宝网商品信息 转载请注明出处 网购时经常会用到淘宝网 点我去淘宝但淘宝网上的商品琳琅满目 xff0c 于是我参照中国大学 MOOC的代码写了一个爬取淘宝网商品信息的程序 代码如下 xff1a span class tok
  • 在Ubuntu中,使用minicom抓串口log

    xff08 1 xff09 先插上串口线 xff0c 连上设备 xff08 2 xff09 确定连的是哪个串口 ls dev tty 如果是串口转USB xff0c 然后连到主机上 xff0c 则为 dev ttyUSB 如果是直接串口连到
  • 【问题解决】Ubuntu中双击文件夹没有反应

    我的情况是 xff0c 在Windows下安装的虚拟机 xff0c 虚拟机上跑的Ubuntu16 04 某天突然出现这个bug xff0c 而且开其他的Ubuntu也是这种情况 百度一下 xff0c 我就知道了 xff0c 是在Window
  • 在Chrome中加载未打包的扩展

    Load the extension Extensions that you download from the Chrome Web Store are packaged up as crx files which is great fo
  • 在VMware下创建ubuntu虚拟机,以及与win建立ssh远程连接,全网最全

    一 下载VMware Workstation 官方下载最新版本 xff0c 正常下载即可 二 下载Ubuntu ios镜像文件 下载地址 xff1a https ubuntu com download desktop 三 Ubuntu 配置
  • log4j2.xml 配置文件详解

    一 log4j2介绍 log4j 2 x版本不再支持像1 x中的 properties后缀的文件配置方式 xff0c 2 x版本配置文件后缀名只能为 34 xml 34 json 34 或者 jsn 34 配置文件的格式 xff1a log
  • 个性化设置shell命令提示符

    实际显示效果如下 xff1a 对应的命令如下 xff0c 可以根据自己喜欢的颜色做修改 xff1a PS1 61 39 debian chroot 43 debian chroot 033 01 32m u 64 h 033 00m 033
  • Python安装时import matplotlib.pyplot as plt报错

    xfeff xfeff from six import advance iterator integer types ImportError No module named six 解决办法是 xff1a 把路径如 xff1a C Pyth
  • easyExcel Content-Type: application/vnd.ms-excel 异常

    自测ok xff0c 部署到服务器就报错 一开始以为消息转换器问题 没看cause by导致定位的方向错误 报错一看 缺少so库导致的 本地是m1pro的arm jdk11 再看看线上的dockerfile 用的是FROM openjdk
  • Xfce,KDE和Gome之间的自由切换。

    今天尝试了一下ubuntu 43 xfce 但是发现xfce虽然轻小 xff0c 但是反映和表现并不好 在兼容性上存在很大的问题 于是决定卸掉xfce 鉴于之前使用gnome和uity比较长久的历史 xff0c 今天决定尝试下kde 首先需
  • SimuLink示波器设置多路输入

    PS xff1a matlab版本 xff1a Matlab2019a step1 xff1a 打开 Simulink Library Browser xff0c 搜索 scope xff08 示波器 xff09 xff0c 拖拽入仿真面板
  • Ubuntu22.04上安装Xilinix Vivado 2018.3

    OpenWiFi的默认编译仿真工具是Xilinx Vivado 218 3 在Ubuntu22 04 LTS上安装Xilinx Vivado 2018 3之前 xff0c 首先要安装如下的库 sudo apt get install lib
  • 将应用加到Ubuntu的Favorites

    Ubuntu可以将从它的repo安装的应用程序加到Favorites xff0c 从而方便使用 但有很多应用程序并不是这样安装的 xff0c 就不能直接加到Favorites 下面的方法可以将任何应用加到Favorites 首先生成一个de
  • Build OpenAirInterface

    OpenAirInterface is a famous open source LTE NR implementation Its buidling guide doc BUILD md says that it can be build
  • Android技巧:学习使用GridLayout

    GridLayout是一个非常强大的网格类布局 xff0c 它不但能像TableLayout那样 xff0c 实现网格类布局 xff0c 但它更为强大的地方在于每个Cell的大小可以横向或者纵向拉伸 xff0c 每个Cell的对齐方式也有很
  • 说说Android的MVP模式

    更多精彩博客 安卓应用开发是一个看似容易 xff0c 实则很难的一门苦活儿 上手容易 xff0c 看几天Java xff0c 看看四大组件咋用 xff0c 就能整出个不太难看的页面来 但是想要做好 xff0c 却是很难 系统框架和系统组件封
  • Android实战技巧:如何在ScrollView中嵌套ListView

    前几天因为项目的需要 xff0c 要在一个ListView中放入另一个ListView xff0c 也即在一个ListView的每个ListItem中放入另外一个ListView 但刚开始的时候 xff0c 会发现放入的小ListView会
  • Android实战技巧:ViewStub的应用

    在开发应用程序的时候 xff0c 经常会遇到这样的情况 xff0c 会在运行时动态根据条件来决定显示哪个View或某个布局 那么最通常的想法就是把可能用到的View都写在上面 xff0c 先把它们的可见性都设为View GONE xff0c
  • 深入浅出Windows BATCH

    1 什么是Windows BATCH BATCH也就是批处理文件 xff0c 有时简称为BAT xff0c 是Windows平台上的一种可执行脚本 xff0c 与 nix Linux和Unix 上的Shell脚本和其他的脚本 xff08 P

随机推荐

  • Android实战技巧:深入解析AsyncTask

    AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧 xff1a 多线程AsyncTask 这里就不重复 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题
  • 学习Kotlin,看这一篇就够了

    人生苦短 xff0c 要用Kotlin 这是一种对程序猿更为友好的语言 xff0c 可以减少开发者的工作量 xff0c 原本由开发者干的事情 xff0c 其实很多都可以由编译器实现了 xff0c 这是一种更为高级的语言 Java虽然严谨 x
  • Ubuntu 超给力终端 Terminator(包含超全快捷键列表)

    Terminator是Ubuntu上的一款拥有强大能力的终端app 文章目录 1 Terminator 特性2 Terminator 安装3 Terminator 快捷键一览 1 Terminator 特性 Terminator 与xter
  • Sed与AWK入门教程之Sed篇

    Sed和AWK是 nix命令行里面文本处理的神器 相当的强大 它们都是面向行的 或者说它们处理文本的方式都是一行接着一行的处理 从标准输入或者文件中读取内容 一行一行的执行脚本命令 然后打印输出到标准输出 直到文件结尾 EOF Sed Se
  • 老鸟的Python入门教程

    重要说明 这不是给编程新手准备的教程 如果您入行编程不久 或者还没有使用过1到2门编程语言 请移步 这是有一定编程经验的人准备的 最好是熟知Java或C 懂得命令行 Shell等 总之 这是面向老鸟的 让老鸟快速上手Python教程 为什么
  • MATLAB自编自适应中值滤波算法

    代码原理 xff1a 在噪声密度不是很大的情况下 xff08 根据经验 xff0c 噪声的出现的概率小于0 2 xff09 xff0c 使用中值滤波的效果不错 但是当噪声出现的概率比较高时 xff0c 原来的中值滤波算法就不是很有效了 只有
  • 利用Github免费搭建个人主页(个人博客)

    之前闲着 利用Github搭了个免费的个人主页 colin1994 xyz 这里是我的一个简单主页 xff0c 有兴趣的朋友可以访问看看 先不公开了 今天到家了 趁着闲着 写一篇相关教程记录自己搭建的过程 涉及 Github注册 Githu
  • SpringMVC的配置

    SpringMVC的配置 一 拦截器 1 拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor xff0c 拦截器需要重写三个方法 xff0c 注意pr
  • Shell 命令基础

    Shell 命令基础 1 命令格式 常见的 Linux 命令的格式如下 xff1a 命令名称 span class token punctuation span 选项 span class token punctuation span 参数
  • android 深度图

    在 Android开发中自定义控件是一个范围很广的话题 xff0c 讲起自定义控件 xff0c 从广度上来划分的话 xff0c 大体上可以划分为 xff1a View ViewGroup的绘制事件分发各种动画效果滚动嵌套机制还有涉及到相关的
  • 非分区表转换为分区表(非联机)

    有些表由于过大 xff0c 需要拆分为分区表 xff0c 由于联机转化可能导致一些问题 xff0c 所以可以采用停机rename的方法 xff0c 可大致按照如下步骤操作 xff1a xff08 假设要删除表 xff0c 名称叫做Table
  • Ngnix反向代理内外网访问

    1 Web应用使用Nginx进行代理 xff0c 内网访问则直接是访问的Nginx 80代理服务器 xff0c 在外网则访问不了 xff0c 所以就有一个问题需要映射网络 2 通过路由器配置将Nginx 80代理服务器80端口映射到Web主
  • 解决windows10睡眠期间自动唤醒的问题

    背景 自己在台式机上安装好windows10后启动睡眠功能 xff0c 发现期间会出现自动唤醒的情况 第一步 在 控制面板 中找到 电源选项 xff0c 在所选的选项里 更改计划设置 xff0c 点击 更改高级电源设置 xff0c 点击 睡
  • “ImportError: No module named carla” 问题的解决方案

    参考 https carla readthedocs io en latest ros installation run the ros bridge 问题描述 安装了ROS bridge 后运行时出错 roslaunch carla ro
  • springboot整合websocket(详解、教程、代码)

    springboot整合websocket 教程及代码 大家好 xff0c 我是酷酷的韩 1 websocket定义 WebSocket协议是基于TCP的一种新的网络协议 它实现了浏览器与服务器全双工 full duplex 通信 允许服务
  • JAVA经典面试题附答案(持续更新版)

    文章目录 前言1 JAVA基础2 JVM 知识3 开源框架知识4 操作系统5 多线程6 数据库知识7 最后附一遍持续整理的博客 前言 前言 少年易老学难成 xff0c 一寸光阴不可轻 未觉池塘春草梦 xff0c 阶前梧叶已秋声 朱熹 劝学诗
  • 视觉应用工程师-环境安装教学视频-Mac系统其他操作

    立即学习 https edu csdn net course play 29993 432706 utm source 61 blogtoedu Mac系统安装miniconda搭建深度学习环境 安装 Conda是一个开源的包 环境管理器
  • Windows 环境下安装Redis 5.0.x 服务图文教程

    Windows 环境下安装Redis 5 0 x 服务图文教程 Redis官网并没有提供windows的安装包 xff0c github有第三方制作的windows安装包 下载地址 xff1a https github com tporad
  • Python 爬虫+可视化,手把手教你使用 Python 爬取 JD 网站并且可视化展示

    当你看到别人使用 Python 网络爬虫做出一些高大上的项目你是否也有那么一点点的心动 xff1f 羡慕别人用几行简单的代码就能获取到自己想要的数据 xff1f 羡慕别人用几行代码就能做出优美的可视化图案 xff1f 我将使用最新 Pyth
  • 推荐系统实践:基于数据集MovieLens构造简单推荐系统

    摘要 本文基于 MovieLens 数据集构造了用户 电影项目评价矩阵 xff0c 并基于评价矩阵计算两用户间的相似度 xff0c 取出相似度最高的 N 个用户作为候选用户序列 接着筛选出这 N 个候选用户的高分电影项目且当前用户尚未观看