数据挖掘R_Python_ML(3): 用R实现一个简易推荐系统

推荐系统在现实生活中应用甚广,电商、社区、社交平台,无不充斥这各种各样的推荐。其实,推荐的原理很简单,无论是给人推荐物,还是给人推荐人,都是无外乎找到和被推荐者具有相同特质的其他用户,看看那些用户结交/买了/浏览了哪些被推荐者没有光顾过的人/商品/书籍/电影/音乐/etc.,将其推荐给被推荐者。

下面我们假设下列文件是一个电影网站的内部记录:

uid,m1, m2, m3, m4, m5, m6, m7, m8, m9, m10

1,5,3,0,4,0,0,1,2,4,4

2,3,1,2,0,0,2,0,0,1,2

3,4,0,1,2,1,0,1,2,4,0

4,0,2,3,0,0,4,2,1,1,2

5,1,3,4,1,2,0,0,0,0,2

6,2,0,0,0,2,3,5,1,4,0

7,4,1,1,0,2,0,1,0,0,3

8,1,2,0,3,0,0,2,1,0,3

9,3,1,0,3,0,4,0,0,1,0

10,2,1,3,1,0,1,0,0,2,1

这个网站总共有10个用户,文件第一列是这些用户的id。该网站提供给用户一共10部电影,供用户打分。文件中第2到11列每列对应一部电影,i行j列就是用户i给电影j打的分。分数限制在1-5区间,如果为0,则说明i并没有给j打过分。

我们现在要做的是,写一个程序,判断某个用户没有打分的那些电影中,有哪些可能是TA感兴趣的。

对于用户i,在推荐给TA电影之前,我们首先要判断,TA和其他用户之间的共性有多强。也就是对所有这10个用户,两两计算相似度。

相似度的计算方法有很多,常用的分为3类:欧氏距离,余弦相似度,皮尔逊相关系数。这里我们采用余弦距离——所谓余弦距离就是利用两个向量之间夹角的余弦值来衡量两个向量之间的相似度,显然夹角越小,余弦值就越大(取值在0-1之间),两个向量就越靠近,即二者越相似。

首先,我们打开R,读入该文件:

> mydata = read.csv(".\\rec_1.csv", header =TRUE)

> rownum = nrow(mydata);rownum

[1] 10

> colnum = ncol(mydata);colnum

[1] 11

要计算余弦距离,就要首先安装一个新的包:lsa。

> install.packages("lsa")

> library(lsa)

然后我们开始计算用户两两之间的余弦距离:

> cossimilar<-function(ui,uj) {

+ indexlist <-list()

+ for (i in 2:colnum){

+ if (mydata[ui,i]> 0 && mydata[uj,i] > 0) {

+ indexlist <-c(indexlist,i)

+ }

+ }

+ indexlen =length(indexlist)

+ if (indexlen < (colnum - 1) * 0.3) {

+ 0

+ } else {

+ tmpui <-vector(length = indexlen)

+ tmpuj <-vector(length = indexlen)

+ for (i in 1:indexlen) {

+ tmpui[i] = mydata[ui,indexlist[[i]]]

+ tmpuj[i] =mydata[uj,indexlist[[i]]]

+ }

+ cosine(tmpui,tmpuj)

+ }

+ }

上面函数用来计算用户i和j之间的余弦距离。首先注意,我们不是把用户i和j对所有商品的评分直接拿来作为计算余弦距离的vector,而是只选择他们共同做了评价那部分电影(把一方或双方未评价的电影排除在外)。

NOTE:此处还有一个小tricky:如果两人共同评价过的电影少于总电影数的30%,则认为两人毫无共同点,余弦距离为0。这个30%是我们认为设定的阈值,可以根据具体数据进行调整。

两两计算相似度:

> cosdata <- matrix(nrow = rownum, ncol = rownum)

> for (i in 1:(rownum-1)) {

+ for (j in (i+1):rownum) {

+ cosdata[i,j] <-cossimilar(i,j)

+ }

+ }

> cosdata

然后依据上面的相似度矩阵,对于一个用户未作评价的电影进行评分预测,具体预测算法是所有和该用户有相似性且评价了该电影的用户对于该电影评分的加权平均。

例如:user1对m3的评分就是:(cos_u1_u2 * score_u2_m3 + cos_u1_u3 * score_u3_m3 + cos_u1_u4 * score_u4_m3 + cos_u1_u5* score_u5_m3 + cos_u1_u7 * score_u7_m3 + cos_u1_u10 * score_u10_m3) / 6。

代码如下:

> rdata <- matrix(nrow = rownum, ncol = (colnum -1))

> for (i in 1:rownum) {

+ for (j in2:colnum) {

+ if (mydata[i,j] ==0) {

+ predictedV = 0

+ simnum = 0

+ if (i > 1) {

+ for (k in 1:(i-1)) {

+ predictedV =predictedV + cosdata[k,i] * mydata[k,j]

+ if (mydata[k,j]> 0) {

+ simnum = simnum + 1

+ }

+ }

+ }

+ if (i <rownum) {

+ for (k in(i+1):rownum) {

+ predictedV =predictedV + cosdata[i,k] * mydata[k,j]

+ if (mydata[k,j]> 0) {

+ simnum = simnum + 1

+ }

+ }

+ }

+ rdata[i,j-1] =predictedV / simnum

+ }

+ }

+ }

> rdata

我们已经预测出了每个用户对于他们没打过分的电影的评分情况。如果预测得分>2分,我们就向该用户推荐该电影:

> for (i in 1:rownum) {

+ cat("Recommendation to User", i, " products: ")

+ for (j in 1: (colnum- 1)) {

+ if(!is.na(rdata[i,j])) {

+ if (rdata[i,j]> 2) {

+ cat( j, ", ")

+ }

+ }

+ }

+ cat("\n")

+ }

Recommendation to User 1 products : 3 , 6 ,

Recommendation to User 2 products : 4 ,

Recommendation to User 3 products : 6 ,

Recommendation to User 4 products : 1 , 4 ,

Recommendation to User 5 products :

Recommendation to User 6 products :

Recommendation to User 7 products :

Recommendation to User 8 products : 6 , 9 ,

Recommendation to User 9 products :

Recommendation to User 10 products :

用户1,2,3,4,8得到了推荐。

原文发布于微信公众号 - 悦思悦读(yuesiyuedu)

原文发表时间:2016-01-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

代码+实战:TensorFlow Estimator of Deep CTR —— DeepFM/NFM/AFM/FNN/PNN

深度学习在 ctr 预估领域的应用越来越多,新的模型不断冒出。从 ctr 预估问题看看 f(x) 设计—DNN 篇(https://zhuanlan.zhihu...

2.4K90
来自专栏大数据文摘

根本停不下来!给它一个轮廓,TensorFlow还你一只完整的喵 (附论文下载)

16040
来自专栏数据派THU

精选10大机器学习开源项目 !(附链接)

本文推荐的10大机器学习开源项目是由Mybridge从250个机器学习开源项目中挑选出来的,Github平均star为1385,主题包含:Tensorflow,...

16890
来自专栏AI研习社

免费!有了这个资料合集轻松玩转TensorFlow !

近日,社长经历了几个不眠长夜,殚精竭力、呕心沥血地在网上搜集了诸多 TensorFlow 相关的文档、教程和数据包等学习和研发资料,总数超过 400M,打算一次...

29260
来自专栏量子位

“你的深度学习框架包含15个漏洞”,360说 | 附论文

允中 李林 编译整理 量子位 出品 | 公众号 QbitAI ? 注意!你的深度学习框架有漏洞! 这个警告来自360安全实验室(Qixue Xiao、Deyue...

34530
来自专栏AI研习社

Google正式发布TensorFlow Lite预览版,针对移动/嵌入设备的轻量级解决方案

日前,谷歌正式发布 TensorFlow Lite 开发者预览版,这是针对移动和嵌入式设备的轻量级解决方案。TensorFlow Lite 是一种全新的设计,具...

33540
来自专栏量子位

MobileNet教程(2):用TensorFlow搭建安卓手机上的图像分类App

王瀚宸 编译自 Hackernoon 量子位 报道 | 公众号 QbitAI 上周末,量子位翻译了一份MobileNet教程,其中讲述了怎样在一个新的数据集上重...

51760
来自专栏量化投资与机器学习

强化学习(Reinforcement Learning)应用于量化投资系列专题(一)——在交易中的应用

今天带来机器学习应用于量化投资系列之 强化学习(Reinforcement Learning)系列(一) 视频来自 YouTube 出自 DeepHack 时...

1.1K100
来自专栏新智元

【Science】破解密码“AlphaGo”诞生,训练Gan破解27%LinkedIn测试集密码

【新智元导读】一项新的研究旨在使用生成对抗网络(GAN) 来加快密码破解的速度。斯蒂文斯理工学院的研究人员用类似“AlphaGo”的方法,利用超过 4300 万...

34960
来自专栏DHUtoBUAA

基于电子海图的水面无人艇全局路径规划

  该论文已经在ICMIR2017会议上发表,附上springer的文献地址 Research and Implementation of Global Pat...

32250

扫码关注云+社区

领取腾讯云代金券