#install.packages("kknn")
library(kknn)
#install.packages("class")
library(class)
setwd("/home/m600/Working Area/Rdata Practice/Customer Course/ml-100k")
data=read.table("u.data")
data=data[,-4] #刪除不用的第四列資料
names(data)=c("userid","itemid","rating")
head(data)
dim(data)
user=read.table("u.user")
head(user)
Userid=1;Itemid=61;n=50;K=10
MovieLens_KNN=function(Userid,Itemid,n,K) {
sub=which(data$userid==Userid)
if(length(sub)>=n) sub_n=sample(sub,n)
if(length(sub)<n) sub_n=sample(sub,length(sub))
known_itemid=data$itemid[sub_n]
unknown_itemid=Itemid
unknown_sub=which(data$itemid==unknown_itemid)
user=data$userid[unknown_sub[-1]]
data_all=matrix(0,1+length(user),2+length(known_itemid))
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)
for (i in 1:nrow(data_all))
{
data_temp=data[which(data$userid==data_all$userid[i]),]
for (j in 1:length(item))
{ 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_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]
fit=knn(data_train_x,data_test_x,cl=data_train_y,k=K)
list("data_all:"=data_all,"True Rating:"=data_test_y,"Predict Rating:"=fit,"User ID:"=Userid,"Item ID:"=Itemid)
}
MovieLens_KNN(Userid=1,Itemid=61,n=50,K=10)
## $`data_all:`
## userid unknown_itemid_ 61 itemid_228 itemid_156 itemid_208 itemid_243
## 1 1 4 5 4 5 1
## 2 76 4 0 3 0 0
## 3 305 4 2 4 0 0
## 4 201 2 3 4 0 0
## 5 195 3 0 0 0 0
## 6 13 4 4 0 5 3
## 7 60 4 4 0 5 0
## 8 354 5 0 0 4 0
## 9 58 5 5 5 0 0
## 10 94 5 4 5 4 0
## 11 452 1 0 4 0 5
## 12 321 5 0 0 0 0
## 13 334 3 5 0 5 0
## 14 493 4 0 1 4 0
## 15 387 3 5 5 3 1
## 16 18 4 0 0 4 0
## 17 391 5 2 0 0 0
## 18 474 3 0 0 3 0
## 19 296 3 4 0 0 0
## 20 380 4 3 0 2 0
## 21 456 4 3 0 4 0
## 22 59 4 4 0 5 1
## 23 144 3 0 0 0 0
## 24 498 4 2 5 0 0
## 25 500 4 0 0 4 0
## 26 592 4 0 0 0 1
## 27 449 5 0 0 0 0
## 28 154 4 0 0 0 0
## 29 279 4 4 4 5 0
## 30 535 3 0 2 0 0
## 31 585 4 0 0 0 0
## 32 405 1 1 0 5 0
## 33 608 5 0 0 0 0
## 34 308 3 0 4 4 0
## 35 189 3 0 0 0 0
## 36 160 4 2 0 0 0
## 37 828 5 0 0 0 0
## 38 257 5 0 0 0 0
## 39 385 2 0 4 3 0
## 40 763 5 0 0 0 0
## 41 409 4 0 2 0 0
## 42 543 4 0 0 0 0
## 43 712 3 3 0 0 4
## 44 537 4 3 0 4 1
## 45 773 5 3 0 0 0
## 46 268 4 4 3 4 0
## 47 645 5 3 0 5 1
## 48 894 4 0 0 0 0
## 49 846 3 5 0 5 0
## 50 868 5 5 3 3 0
## 51 883 5 4 0 4 0
## 52 903 4 0 5 0 0
## 53 450 4 4 0 5 0
## 54 862 5 5 0 2 0
## 55 655 3 3 2 3 0
## 56 758 3 3 0 4 0
## 57 877 5 4 0 0 0
## 58 299 4 3 0 4 0
## 59 639 3 0 0 0 0
## itemid_226 itemid_82 itemid_108 itemid_198 itemid_264 itemid_103
## 1 3 5 5 5 2 1
## 2 0 0 0 0 3 0
## 3 0 0 0 4 0 0
## 4 3 4 0 4 0 0
## 5 0 0 0 3 3 0
## 6 4 2 0 3 4 0
## 7 0 3 0 0 0 0
## 8 0 0 0 0 0 0
## 9 0 0 0 3 0 0
## 10 2 4 0 0 0 0
## 11 0 3 0 0 0 0
## 12 0 0 0 4 0 0
## 13 0 4 0 0 0 0
## 14 0 5 0 0 3 0
## 15 3 4 0 4 0 0
## 16 0 3 0 3 0 0
## 17 0 0 0 0 1 0
## 18 0 0 0 3 0 0
## 19 0 0 0 5 0 0
## 20 0 0 0 0 0 0
## 21 2 0 0 0 0 0
## 22 4 5 0 5 0 0
## 23 0 0 0 4 0 0
## 24 0 0 0 0 0 0
## 25 0 4 0 0 0 0
## 26 0 0 0 5 2 0
## 27 0 0 0 4 0 0
## 28 0 0 0 0 0 0
## 29 4 0 4 3 0 0
## 30 0 0 0 4 0 0
## 31 0 0 0 5 0 0
## 32 2 4 0 2 0 0
## 33 0 0 0 0 0 0
## 34 3 4 0 3 2 0
## 35 0 0 0 4 0 0
## 36 0 0 0 0 0 0
## 37 0 0 0 4 0 0
## 38 0 0 0 3 0 0
## 39 0 1 0 3 0 0
## 40 0 0 0 5 0 0
## 41 0 0 0 0 1 0
## 42 4 4 0 4 0 0
## 43 0 5 0 0 0 0
## 44 2 2 0 2 0 0
## 45 0 0 0 4 2 0
## 46 4 3 3 4 3 0
## 47 0 0 0 3 0 0
## 48 0 0 0 4 3 0
## 49 4 2 0 5 0 0
## 50 0 2 0 5 0 0
## 51 3 3 0 5 0 0
## 52 0 0 0 4 0 0
## 53 4 3 0 0 3 0
## 54 0 4 0 5 0 0
## 55 3 2 0 4 0 0
## 56 0 4 5 0 0 0
## 57 3 0 0 0 0 0
## 58 0 0 0 4 2 0
## 59 0 0 0 2 0 0
## itemid_246 itemid_145 itemid_9 itemid_260 itemid_7 itemid_238
## 1 5 2 5 1 4 4
## 2 0 0 0 0 4 0
## 3 3 0 0 0 4 3
## 4 0 3 3 4 3 3
## 5 0 0 0 0 0 0
## 6 0 2 3 1 2 3
## 7 0 0 5 0 5 0
## 8 4 0 3 0 4 4
## 9 5 0 4 0 5 5
## 10 4 0 5 2 4 5
## 11 0 0 0 0 5 0
## 12 0 0 4 0 4 0
## 13 4 0 4 0 5 4
## 14 0 0 0 1 3 3
## 15 3 0 0 0 5 5
## 16 0 0 5 0 0 5
## 17 0 0 5 0 0 5
## 18 0 0 5 0 5 4
## 19 4 0 4 0 5 4
## 20 0 0 3 0 3 3
## 21 0 0 3 0 0 4
## 22 0 0 4 0 4 5
## 23 0 0 5 0 2 0
## 24 0 0 2 0 3 4
## 25 5 0 4 0 5 4
## 26 5 0 5 4 5 5
## 27 0 0 4 0 0 0
## 28 0 0 0 0 0 5
## 29 0 0 0 0 5 4
## 30 0 0 5 0 5 4
## 31 0 0 0 0 0 0
## 32 0 0 0 0 0 5
## 33 0 0 4 0 0 5
## 34 0 0 4 0 4 5
## 35 4 0 3 0 3 5
## 36 0 0 3 0 3 0
## 37 2 0 0 0 0 0
## 38 0 0 0 0 0 0
## 39 0 1 0 0 0 5
## 40 0 0 0 0 0 4
## 41 0 0 4 0 0 0
## 42 0 0 4 0 0 3
## 43 0 0 0 0 0 3
## 44 0 0 0 0 4 4
## 45 0 3 0 2 2 4
## 46 5 1 0 3 4 3
## 47 0 0 0 0 0 0
## 48 4 0 4 2 4 0
## 49 0 0 0 0 0 5
## 50 0 1 0 0 5 4
## 51 0 0 4 0 5 4
## 52 0 0 3 0 2 5
## 53 0 3 0 2 4 5
## 54 0 0 0 5 5 4
## 55 3 0 3 0 3 3
## 56 0 0 0 0 5 5
## 57 0 0 0 0 0 0
## 58 0 0 0 0 3 4
## 59 0 0 0 0 0 0
## itemid_224 itemid_261 itemid_22 itemid_49 itemid_182 itemid_240
## 1 5 1 4 3 4 3
## 2 0 0 0 0 4 0
## 3 0 0 0 3 0 0
## 4 0 0 2 0 4 3
## 5 0 0 0 0 0 0
## 6 4 1 4 4 5 0
## 7 0 0 0 0 0 0
## 8 0 0 0 0 0 0
## 9 0 0 0 0 4 4
## 10 0 0 4 4 5 0
## 11 0 0 5 0 0 0
## 12 3 0 0 0 3 0
## 13 2 0 4 0 3 0
## 14 0 0 5 0 5 0
## 15 5 0 5 0 5 0
## 16 5 0 5 0 4 0
## 17 0 0 4 0 4 0
## 18 0 0 4 0 5 0
## 19 0 0 4 0 0 1
## 20 0 0 4 0 3 0
## 21 0 0 4 0 3 0
## 22 0 0 4 0 5 2
## 23 0 0 5 0 3 0
## 24 0 0 0 0 4 0
## 25 0 0 0 4 2 0
## 26 5 1 5 0 5 0
## 27 4 0 0 0 0 0
## 28 0 0 0 0 5 0
## 29 4 0 1 0 0 4
## 30 0 0 3 0 3 0
## 31 2 0 0 0 0 0
## 32 0 0 5 1 1 0
## 33 0 0 4 0 4 0
## 34 0 0 4 3 5 0
## 35 0 0 0 0 0 0
## 36 0 0 0 0 5 4
## 37 3 0 0 0 0 0
## 38 4 0 0 0 0 0
## 39 2 0 0 0 5 4
## 40 5 0 4 0 0 0
## 41 0 0 2 0 0 0
## 42 0 0 3 0 0 0
## 43 0 0 0 3 0 0
## 44 3 0 2 0 4 0
## 45 0 0 0 0 4 2
## 46 0 0 0 0 4 2
## 47 0 0 4 0 5 0
## 48 0 0 0 0 0 0
## 49 0 0 4 0 5 0
## 50 0 0 0 0 0 5
## 51 4 0 3 3 0 0
## 52 0 0 0 0 5 4
## 53 0 0 5 5 5 0
## 54 0 0 5 0 5 0
## 55 3 0 2 1 4 3
## 56 4 0 0 0 0 3
## 57 0 0 0 0 0 0
## 58 0 0 0 4 3 2
## 59 0 0 0 0 0 0
## itemid_102 itemid_177 itemid_126 itemid_169 itemid_203 itemid_73
## 1 2 5 2 5 4 3
## 2 0 0 0 0 4 0
## 3 0 0 0 5 4 0
## 4 0 0 0 0 5 0
## 5 0 0 0 0 0 0
## 6 0 5 0 0 0 3
## 7 0 0 0 0 0 4
## 8 0 0 0 3 0 0
## 9 0 0 0 4 5 0
## 10 3 5 0 0 5 0
## 11 2 0 0 0 3 3
## 12 0 0 0 0 0 0
## 13 0 0 0 4 4 3
## 14 0 0 0 0 0 0
## 15 3 0 0 5 4 0
## 16 0 3 5 5 0 0
## 17 0 4 0 0 4 0
## 18 0 0 4 0 5 3
## 19 0 0 0 0 0 0
## 20 0 3 0 0 0 0
## 21 0 4 0 0 0 0
## 22 2 4 5 4 4 4
## 23 0 0 4 0 0 3
## 24 0 0 0 0 5 0
## 25 0 0 0 0 0 0
## 26 0 0 0 5 5 0
## 27 0 0 0 0 0 0
## 28 0 0 0 0 0 0
## 29 0 0 0 5 2 4
## 30 0 0 0 0 3 0
## 31 0 0 0 0 0 0
## 32 1 1 0 1 1 5
## 33 0 0 1 0 0 0
## 34 0 5 0 5 5 3
## 35 0 0 0 0 3 0
## 36 0 0 3 4 0 0
## 37 0 0 0 0 0 0
## 38 0 0 0 0 0 0
## 39 0 4 0 5 0 0
## 40 0 0 0 0 0 3
## 41 0 0 0 0 5 0
## 42 4 4 0 4 0 0
## 43 4 2 0 0 0 5
## 44 1 3 0 0 4 0
## 45 0 0 0 5 0 0
## 46 0 0 0 5 5 3
## 47 0 4 0 0 4 3
## 48 0 0 3 0 0 0
## 49 2 3 0 0 5 4
## 50 0 0 0 5 0 1
## 51 0 0 0 0 0 0
## 52 0 4 0 0 4 0
## 53 4 4 5 5 4 3
## 54 0 4 0 0 4 0
## 55 0 0 2 0 3 0
## 56 0 5 0 0 5 0
## 57 0 0 0 0 4 0
## 58 0 0 0 4 0 2
## 59 0 0 0 0 0 0
## itemid_235 itemid_212 itemid_140 itemid_253 itemid_220 itemid_176
## 1 5 4 1 5 3 5
## 2 0 0 0 0 0 0
## 3 0 3 0 0 0 4
## 4 0 4 0 0 0 4
## 5 3 0 0 0 0 0
## 6 2 5 0 0 0 3
## 7 0 5 0 0 0 4
## 8 0 0 0 0 0 0
## 9 0 0 0 0 0 4
## 10 4 0 0 0 0 4
## 11 0 2 0 0 0 0
## 12 0 3 0 0 0 0
## 13 3 0 0 0 3 3
## 14 2 0 0 0 0 5
## 15 0 0 0 0 0 3
## 16 0 5 0 0 0 0
## 17 0 0 0 0 0 3
## 18 0 4 0 0 0 5
## 19 0 0 0 0 0 0
## 20 0 0 0 0 0 3
## 21 0 0 0 0 0 0
## 22 1 4 1 0 2 5
## 23 1 5 0 0 0 4
## 24 0 3 0 0 0 2
## 25 5 0 0 0 0 0
## 26 3 0 3 1 0 5
## 27 0 5 0 0 0 0
## 28 0 0 0 0 0 0
## 29 3 0 0 0 0 3
## 30 0 4 0 0 0 0
## 31 0 5 0 0 0 0
## 32 0 1 3 0 0 1
## 33 0 0 0 0 0 0
## 34 3 0 0 0 0 4
## 35 0 0 0 4 0 4
## 36 0 0 0 0 0 0
## 37 0 0 0 0 0 0
## 38 0 0 0 0 0 0
## 39 5 0 0 3 0 2
## 40 0 4 0 0 0 4
## 41 0 0 0 0 0 0
## 42 0 4 0 0 0 4
## 43 0 0 4 0 5 0
## 44 1 3 2 0 0 2
## 45 4 2 0 0 0 4
## 46 3 0 0 0 0 5
## 47 0 4 0 0 0 0
## 48 0 5 0 0 0 0
## 49 0 5 4 0 0 4
## 50 0 0 0 0 0 4
## 51 0 5 0 0 0 4
## 52 0 0 0 0 0 0
## 53 3 0 3 0 4 4
## 54 0 0 0 0 0 5
## 55 0 3 0 0 2 2
## 56 5 4 0 5 0 5
## 57 0 0 0 0 0 5
## 58 1 4 0 0 0 4
## 59 0 4 0 0 0 0
## itemid_193 itemid_105 itemid_206 itemid_241 itemid_96 itemid_18
## 1 4 2 4 4 5 4
## 2 0 0 0 0 5 0
## 3 0 0 0 0 3 0
## 4 3 0 2 2 4 0
## 5 0 0 0 0 0 0
## 6 5 0 0 3 4 0
## 7 0 0 0 0 4 0
## 8 3 0 0 3 0 0
## 9 3 0 0 0 0 0
## 10 5 0 4 4 3 0
## 11 0 0 0 0 2 0
## 12 3 0 0 0 0 0
## 13 4 0 0 0 0 0
## 14 0 0 0 0 4 0
## 15 5 0 4 1 4 0
## 16 5 0 0 3 0 0
## 17 0 0 0 0 3 0
## 18 4 0 0 0 4 0
## 19 0 0 0 0 5 0
## 20 0 0 0 2 0 0
## 21 0 0 0 0 0 0
## 22 4 0 0 4 5 4
## 23 4 2 0 0 5 0
## 24 0 0 0 0 0 0
## 25 0 0 0 0 0 0
## 26 5 0 0 0 5 0
## 27 0 1 0 0 0 0
## 28 0 0 0 0 0 0
## 29 2 4 0 0 4 0
## 30 4 0 0 0 0 0
## 31 0 0 0 0 0 2
## 32 4 0 1 1 3 0
## 33 4 0 0 0 0 0
## 34 3 0 0 4 4 0
## 35 0 2 0 3 5 0
## 36 0 0 0 0 0 0
## 37 0 0 0 0 0 0
## 38 0 0 0 0 0 0
## 39 0 0 0 0 0 5
## 40 0 0 0 0 2 0
## 41 0 0 4 0 0 0
## 42 0 0 0 0 4 0
## 43 0 0 0 0 5 0
## 44 4 0 1 3 3 0
## 45 0 0 0 0 2 0
## 46 0 2 3 3 5 0
## 47 0 0 0 0 3 0
## 48 0 0 0 0 0 0
## 49 5 0 0 4 4 0
## 50 2 0 5 0 2 0
## 51 0 0 0 4 4 0
## 52 0 3 0 0 2 0
## 53 5 0 0 4 4 0
## 54 4 3 0 0 4 0
## 55 3 0 0 0 3 3
## 56 0 2 0 3 5 0
## 57 0 0 0 4 0 0
## 58 0 0 0 3 0 0
## 59 3 0 0 0 0 0
## itemid_134 itemid_139 itemid_249 itemid_157 itemid_91 itemid_146
## 1 4 3 4 4 5 4
## 2 0 0 0 0 0 0
## 3 5 0 3 0 2 0
## 4 4 0 0 4 0 1
## 5 5 0 0 0 0 0
## 6 0 0 0 3 2 0
## 7 4 0 0 0 0 0
## 8 4 0 0 0 0 0
## 9 5 0 4 0 0 0
## 10 5 0 0 5 5 0
## 11 3 0 0 0 0 0
## 12 3 0 0 0 0 0
## 13 5 0 0 0 4 0
## 14 3 0 4 0 3 0
## 15 0 0 0 0 4 0
## 16 5 0 0 3 3 0
## 17 4 0 0 0 0 0
## 18 4 0 0 0 0 0
## 19 5 0 0 0 0 0
## 20 3 1 0 0 0 0
## 21 0 0 0 0 2 0
## 22 5 0 0 0 4 0
## 23 0 0 0 0 2 0
## 24 3 0 0 0 0 0
## 25 5 0 3 0 0 0
## 26 5 0 4 5 0 0
## 27 0 0 0 0 0 0
## 28 0 0 0 0 0 0
## 29 0 3 3 0 0 1
## 30 5 0 0 0 0 0
## 31 0 0 0 0 0 0
## 32 0 3 0 0 2 0
## 33 3 0 0 1 0 0
## 34 5 3 0 5 4 0
## 35 5 0 0 4 3 0
## 36 0 0 0 5 0 0
## 37 0 0 0 0 0 0
## 38 0 0 0 0 0 0
## 39 5 0 2 0 0 0
## 40 0 0 0 4 0 0
## 41 5 0 0 0 0 0
## 42 5 0 2 3 0 0
## 43 0 0 0 0 0 0
## 44 5 0 0 0 2 0
## 45 0 0 0 0 4 0
## 46 5 2 4 0 3 0
## 47 5 0 0 0 3 0
## 48 4 0 3 0 0 0
## 49 4 2 0 0 4 0
## 50 0 1 0 0 3 0
## 51 5 0 0 0 0 0
## 52 0 0 0 4 5 0
## 53 3 5 0 3 4 0
## 54 0 0 0 0 5 0
## 55 4 0 3 3 0 0
## 56 5 4 4 0 4 0
## 57 0 0 0 0 0 0
## 58 4 0 3 0 4 0
## 59 0 0 0 0 0 0
## itemid_142 itemid_218 itemid_242 itemid_180
## 1 2 3 5 3
## 2 0 0 0 0
## 3 0 0 5 4
## 4 0 4 4 3
## 5 0 0 4 0
## 6 0 1 2 5
## 7 0 4 0 4
## 8 0 0 5 3
## 9 0 0 0 0
## 10 3 3 0 5
## 11 0 0 0 4
## 12 0 0 0 4
## 13 3 3 0 0
## 14 0 0 0 4
## 15 0 3 0 4
## 16 4 0 5 4
## 17 0 0 0 5
## 18 0 4 0 5
## 19 0 0 4 5
## 20 0 0 0 2
## 21 0 4 0 4
## 22 1 5 0 4
## 23 0 0 4 4
## 24 0 3 0 4
## 25 0 0 3 0
## 26 0 0 5 5
## 27 0 0 0 0
## 28 0 0 3 0
## 29 0 0 3 2
## 30 0 0 0 4
## 31 0 0 0 0
## 32 1 5 0 3
## 33 0 4 0 0
## 34 0 5 0 5
## 35 0 0 0 5
## 36 0 4 0 0
## 37 0 0 0 0
## 38 0 0 0 0
## 39 0 2 0 4
## 40 0 0 0 0
## 41 0 0 0 5
## 42 0 3 0 4
## 43 4 0 0 0
## 44 0 0 3 4
## 45 0 2 0 0
## 46 0 2 0 3
## 47 0 0 0 4
## 48 0 0 4 0
## 49 3 4 0 5
## 50 1 3 0 4
## 51 0 0 0 0
## 52 0 0 0 5
## 53 5 4 0 4
## 54 0 0 0 5
## 55 0 3 4 0
## 56 0 4 3 0
## 57 0 0 0 0
## 58 0 0 0 0
## 59 0 0 4 0
##
## $`True Rating:`
## [1] 4
##
## $`Predict Rating:`
## [1] 3
## Levels: 1 2 3 4 5
##
## $`User ID:`
## [1] 1
##
## $`Item ID:`
## [1] 61
user1=NULL
for(Item in 1:20)
user1=c(user1,MovieLens_KNN(Userid=1,Itemid=Item,n=50,K=10)$`True Rating:`)
## Warning in knn(data_train_x, data_test_x, cl = data_train_y, k = K): k = 10
## exceeds number 9 of patterns
user1 #我們預測user1 對這20部電影的評分
## [1] 5 3 4 3 3 5 4 1 5 3 2 5 5 5 5 5 3 4 5 4
which(user1==5) #顯示評分為五分的ID
## [1] 1 6 9 12 13 14 15 16 19