用R实现KNN推荐案例

参考用书:数据挖掘:R语言实战      黄文 王正林  编著 

 整体思路
1,选择用户已给出评分的用户假设有m位符合的用户,获取电影ID
2,再找出对某电影进行评分的用户,假设有m位符合的用户,并获取用户ID
3,利用以上获取的三组ID,构造训练集data-train和测试集data—test。
4,将相应的训练集与测试集按顺序放入knn()函数,即可预测出用户对电影的评分值

#MovieLens | GroupLens数据集地址  https://grouplens.org/datasets/movielens/
setwd("C://Users//Administrator//Desktop//数据分析//ml-100k")#设定常用工作路径
library(class)
data=read.table("u.data")#读取数据
data=data[,-4]#不需要时间戳变量,删除
names(data)=c("userid","itemid","rating")#命名data的各变量名
head(data);dim(data)
Userid=1;Itemid=61;n=50;K=10#设置4个参数值,
MovieLnes_KNN=function(Userid,Itemid,n,K)#编写一个总函数可以反复使用
{
  sub=which(data$userid==Userid)#获取待测用户在数据集中各条信息所在的行标签,存于sub
  if(length(sub)>=n)
    sun_n=sample(sub,n)
  if(length(sub)<n)
    sun_n=sample(sub,length(sub))#随机抽取n个已评分的电影ID
  known_itemid=data$itemid[sun_n]#获取已评分电影的ID
  unknown_itemid=Itemid#获取带预测电影的ID
  known_itemid
  unknown_itemid
  unknown_sub=which(data$itemid==unknown_itemid)
  user=data$userid[unknown_sub[-1]]#获取已评价电影的用户ID
  user
  data_all=matrix(0,1+length(user),2+length(known_itemid))#设置data.all的行数、列数,所有值暂取0
  data_all=data.frame(data_all)
  names(data_all)=c("userid",paste("unknown_itemid_",Itemid),paste("itemid_",known_itemid,sep=""))
  item=c(unknown_itemid,known_itemid)
  data_all$userid=c(Userid,user)#对变量赋值
  data_all
  for(i in 1:nrow(data_all))#对data_all按行进行外层循环
  {
    data_temp=data[which(data$userid==data_all$userid[i]),]
    for(j in 1:length(item))#对data—all按列进行内层循环
    {if(sum(as.numeric(data_temp$itemid==item[j]))!=0)#判断该位置是否有取值
    {data_all[i,j+1]=data_temp$rating[which(data_temp$itemid==item[j])]
    }
    }
  }
  data_all
  data_test_x=data_all[1,c(-1,-2)]#获取测试集的已知部分
  data_test_y=data_all[1,2]#获取测试集的待预测值
  data_train_x=data_all[-1,c(-1,-2)]#获取训练集的已知部分
  data_train_y=data_all[-1,2]#获取训练集的待预测值
  dim(data_test_x);length(data_test_y)
  dim(data_train_x);length(data_train_y)
  fit=knn(data_train_x,data_test_x,cl=data_train_y,k=K)#进行knn判别
  list("data_all:"=data_all,"True Rating:"=data_test_y,"Predcit Rating:"=fit,"User ID:"=Userid,"Item ID:"=Itemid)
}
user1=NULL

for(Item in 1:20)
  user1=c(user1,MovieLnes_KNN(Userid=1,Itemid=Item,n=50,K=10)$'True Rating:')
user1
which(user1==5)#显示评分为5的电影
#预测用户对电影的评分,推荐评分为5的电影

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值