一,前提准备

        1.R语言包:ggplot2包(绘图),recommenderlab包,reshape包(数据处理)
        2.获取数据:大家可以在明尼苏达州大学的社会化计算研究中心官网上面下载这些免费数据集,网站链接为http://grouplens.org/datasets/movielens/,也可以通过网盘下载https://yunpan.cn/Oc6R9apvCnVXGc
访问密码 e1af。这里包含了数据集和数据说明,该数据集是由943位用户对1682部电影的一个评分,每个评分值为1,2,3,4,5。关于数据信息,在数据说明里面有详细的说明,这里就不再赘述。

二,数据处理

   首先加载我们所需要的包:
library(recommenderlab)
library(reshape)
library(ggplot2)

接下来我们就要读取数据,如果数据在当前的工作目录,那么我们就可以在下面的代码里面直接输入数据名称,即u.data。当数据不在当前工作目录下的时候,我们就可以通过输入路径来读取数据。

mydata<-read.table("E:/my blog/R blog/movie/ml-100k/u.data",header = FALSE,stringsAsFactors = TRUE)

代码里面的stringsAsFactors = TRUE表示表中的所有列都不是因子,是数值型数据。

我们可以通过head()函数查看该数据集前6行的数据。第一列为用户ID,第二列电影ID,第三列是评分,第四列是用户评分的时间。这些在数据介绍中都要介绍。用户的评论时间对我们的分析没有用处,因此我们可以删掉这一列。
mydata<-mydata[,-4]

现在这份数据集只有三列。我要使用ggplot2分析用户对电影的评分结果。我决定要使用饼图来展现出结果,这样可以很好的展现评分列的分布特点。

ggplot(mydata,x=V3,aes(x=factor(1),fill=factor(V3)))+geom_bar(width = 1)+
coord_polar(theta="y")+ggtitle("评分分布图")+
labs(x="",y="")+
guides(fill=guide_legend(title = '评分分数'))

由图可知,评分为一分,两分的特别少,用户给出三分,四分的比较多,占了三分之二多。当一个新电影的评分低于3.5分时,差不多就失去了一半的用户。

        使用reshape包对数据进行处理,生成一个v1*v2,v3值的填充矩阵。
mydata<-cast(mydata,V1~V2,value="V3")
#生成一个以v1为行,v2为列的矩阵,使用v3进行填充
mydata<-mydata[,-1]#第一列数字为序列,可以删除

这个时候,mydata有两个属性值cast_df 和data.frame,想要了解更多关于cast_df,可以查看下面这个网址https://www.r-statistics.com/tag/cast_df/。我们要将mydata属性改为数据框,其中cast_df是不能直接转换为matrix的,因此需要去掉这个类属性,只保留data.frame。

class(mydata)<-"data.frame"

接下来,我们仍要对数据进行处理,使之转换成recommenderlab包可以处理的realRatingMatrix属性。在下面,我们首先将mydata转化为一个矩阵,然后使用as()函数,进行强制类型转换,达到了我们要的结果。

mydata<-as.matrix(mydata)
mydata<-as(mydata,"realRatingMatrix")
mydata
#生成一个943*1682realRatingMatrix类型的矩阵,包括了100000条记录

我们还需要给我每列数据命名,否则后面建模会出现报错。

colnames(mydata)<-paste0("M",1:1682,sep="")
as(mydata,"matrix")[1:6,1:6]

三,建立模型

在recommenderlab包里面,针对realRatingMatrix数据类型,总共提供了6种模型,分别是:基于项目协同过滤(IBCF),主成分分析(PCA),基于流行度推荐(POPULAR),随机推荐(RANDOM),奇异值分解(SVD),基于用户协同过滤算法(UBCF)。
协同过滤主要有两个步骤:①依据目标用户的已知电影评分找到与目标用户观影风格相似的用户群。②计算该用户群对其他电影的评分,并作为目标用户的预测评分。
这份数据是943位用户对1682部电影的一个评分,但每个人不可能将这些电影全都看完,而且不可能对所有看过的电影进行评分,因此我们我们刚刚生成的评分矩阵是一个非常稀疏,而且含有许多缺失值的矩阵。但这些并不影响协同过滤的工作效果。所以我们选择了协同过滤来建立我们的模型。

mydata.model<-Recommender(mydata[1:800],method="UBCF")
mydata.predict<-predict(mydata.model,mydata[801:803],type="ratings")
#预测
as(mydata.predict,"matrix")[1:3,1:6]

M1       M2       M3       M4       M5       M6
801 4.023833 4.017790 4.099041 4.061437 4.038462 4.038462
802 3.719220 3.505469 3.482577 3.485396 3.373351 3.493333
803 3.021637 3.090909 3.099141 3.099141 3.090909 3.090909
上面这就是对801,802,803用户对     M1       M2       M3       M4       M5       M6的预测评分,评分基本都在3—4分之间,与之前我们分析结果相同。

    我们也可以给用户推荐电影,我们可以使用predict()函数,只需要给修改一下参数就行。
mydata.predict2<-predict(mydata.model,mydata[801:803],n=5)
as(mydata.predict2,"list")

运行结果如下:

$`801`
[1] “M272” “M258” “M315” “M327” “M298”$`802`
[1] “M313” “M50”  “M298” “M328” “M127”

$`803`
[1] “M302” “M268” “M272” “M313” “M9”

这里表示的意思是给用户801推荐了电影有“M272” “M258” “M315” “M327” “M298″这么5个,其他代表含义相同。

参考书籍:R语言实战:编程基础,统计分析与数据挖掘宝典

【转】基于R语言构建的电影评分预测模型的更多相关文章

  1. 基于R语言的时间序列指数模型

    时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...

  2. R语言构建蛋白质网络并实现GN算法

    目录 R语言构建蛋白质网络并实现GN算法 1.蛋白质网络的构建 2.生物网络的模块发现方法 3.模块发现方法实现和图形展示 4.附录:igraph中常用函数 参考链接 R语言构建蛋白质网络并实现GN算 ...

  3. 概率图模型 基于R语言 这本书中的第一个R语言程序

    概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...

  4. 基于R语言的ARIMA模型

    A IMA模型是一种著名的时间序列预测方法,主要是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型.ARIMA模型根据原序列是否平稳以及 ...

  5. Twitter基于R语言的时序数据突变检测(BreakoutDetection)

    Twitter开源的时序数据突变检测(BreakoutDetection),基于无参的E-Divisive with Medians (EDM)算法,比传统的E-Divisive算法快3.5倍以上,并 ...

  6. 基于R语言的航空公司客户价值分析

    分析航空公司现状 1.行业内竞争 民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司.民营航空公司,甚至国外航空巨头.航空产品生产过剩,产品同质化特征愈加明显,于是航空公司从价 ...

  7. 基于R语言的梯度推进算法介绍

    通常来说,我们可以从两个方面来提高一个预测模型的准确性:完善特征工程(feature engineering)或是直接使用Boosting算法.通过大量数据科学竞赛的试炼,我们可以发现人们更钟爱于Bo ...

  8. 基于R语言的结构方程:lavaan简明教程 [中文翻译版]

    lavaan简明教程 [中文翻译版] 译者注:此文档原作者为比利时Ghent大学的Yves Rosseel博士,lavaan亦为其开发,完全开源.免费.我在学习的时候顺手翻译了一下,向Yves的开源精 ...

  9. 中文分词实践(基于R语言)

    背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来.然后做中文分词+词频统计,最后将统计结果简单做个标签云.效果例如以下: 兴许:中文分词是中文信息处理的基础.分词之后.事 ...

随机推荐

  1. react-native 常规操作

    1.  关闭xcode打开模拟器的快捷键 , 等常规操作 https://www.jianshu.com/p/f6723f3406b7

  2. iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)

    iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...

  3. 事后分析报告(Postmortem Report)要求

    在得到M1 团队成绩之后, 每个团队都需要编写一个事后分析报告,对于团队在M1阶段的工作做一个总结. 请根据下面的模板总结并发表博客: http://www.cnblogs.com/xinz/arch ...

  4. No.110_第三次团队会议

    前端的易帜 前端在整个软件中有着举足轻重的地位.前端设计一般可以理解为视觉设计,前端开发则是前台代码的实现. 随着科技水平的提高和生产力的提高,人民对于审美的要求逐渐增高.在没有科技壁垒的情况下,是否 ...

  5. 奔跑吧DKY——团队Scrum冲刺阶段-Day 3

    今日完成任务 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如果完成的任务为调研任务,需给出对应的调研总结博客链接:如果完成的任务为学习技术任务,需 ...

  6. 150314 解决老师给二柱子出的问题 之 ver1.0

    一个晚上的成果,效果捉鸡,代码很乱.暂定ver1.0 //Powered by LZR! 2015.3.14#include<iostream> #include<stdio.h&g ...

  7. 使用exe4j将jar包导出为exe

    Exe4J使用方法 此工具是将Java程序包装成exe格式文件工具.(点击exe4j\bin\exe4j.exe文件)启动后如下图所示 如果未注册,则可使用这个注册码:A-XVK209982F-1y0 ...

  8. 软工1816 · Beta冲刺(7/7)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 协助完成安卓端的整合 完成安卓端的美化 协助制作宣传视频 接下来的计划 &am ...

  9. mvc拦截请求IHttpModule

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  10. [二叉树建树]1119. Pre- and Post-order Traversals (30) (前序和后序遍历建立二叉树)

    1119. Pre- and Post-order Traversals (30) Suppose that all the keys in a binary tree are distinct po ...