table_rating=read.table("F://ML/UserItemRatings.txt",header=T, sep= "\t", colClasses=c(rep("numeric", 18), "character"))
head(table_rating,n = 6L)
## X.Птицы..Хичкока X.Трансформеры. X.Терминатор.2.
## 1 NA NA NA
## 2 NA 6 10
## 3 NA NA NA
## 4 NA 0 10
## 5 8 NA 9
## 6 NA 3 6
## X.Красота.по.американски.
## 1 9
## 2 8
## 3 NA
## 4 10
## 5 10
## 6 7
## X.Ирония.судьбы.или.с.лёгким.паром..Э..Рязанова X.Тупой.и.ещё.тупее.
## 1 0 NA
## 2 9 7
## 3 10 NA
## 4 10 8
## 5 9 5
## 6 10 4
## X.Маска. X.Амели. X.Пианист. X.Идентификация.Борна. X.Неудержимые.
## 1 9 9 10 NA NA
## 2 9 9 NA 5 3
## 3 NA 5 10 NA NA
## 4 9 10 8 6 NA
## 5 6 7 NA 9 10
## 6 6 7 NA 6 NA
## X.Ёлки. X.Укрощение.строптивой. короткометражки.Чарли.Чаплина
## 1 NA 10 10
## 2 1 10 7
## 3 NA NA 7
## 4 2 NA 10
## 5 3 9 NA
## 6 5 7 7
## X.300.спартанцев. X.Бэтмен.и.Робин. X.Крепкий.орешек.
## 1 NA NA NA
## 2 4 6 8
## 3 7 NA NA
## 4 0 2 10
## 5 NA 8 6
## 6 8 7 4
## X.Очень.страшное.кино. Введите.свои.ФИО.или.прозвище
## 1 NA
## 2 4
## 3 NA
## 4 0
## 5 3
## 6 5
new_user_rating=c(1,1,10,1,1,1,8,1,1,1,1,1,2,1,1,1,1,1,NA)
table_rating2=rbind(table_rating[,-19],new_user_rating)
table_rating2=t(table_rating2)
head(table_rating2,n = 6L)
## 1 2 3 4 5 6 7 8 9
## X.Птицы..Хичкока NA NA NA NA 8 NA 7 NA NA
## X.Трансформеры. NA 6 NA 0 NA 3 5 10 2
## X.Терминатор.2. NA 10 NA 10 9 6 3 8 1
## X.Красота.по.американски. 9 8 NA 10 10 7 5 10 2
## X.Ирония.судьбы.или.с.лёгким.паром..Э..Рязанова 0 9 10 10 9 10 8 10 1
## X.Тупой.и.ещё.тупее. NA 7 NA 8 5 4 6 10 1
## 10 11 12 13 14 15 16 17 18
## X.Птицы..Хичкока NA NA NA 6 3 7 6 NA 5
## X.Трансформеры. NA NA 1 NA 3 2 8 6 3
## X.Терминатор.2. 4 10 6 NA 1 5 4 7 5
## X.Красота.по.американски. 8 NA 8 4 2 7 NA NA 2
## X.Ирония.судьбы.или.с.лёгким.паром..Э..Рязанова 4 10 7 7 3 7 NA 10 7
## X.Тупой.и.ещё.тупее. 4 NA NA 6 3 1 5 NA 1
## 19 20 21 22 23 24 25 26
## X.Птицы..Хичкока 6 7 3 0 1 4 7 1
## X.Трансформеры. 6 8 8 3 3 7 5 1
## X.Терминатор.2. 4 6 3 2 6 2 7 10
## X.Красота.по.американски. 6 8 2 0 4 6 5 1
## X.Ирония.судьбы.или.с.лёгким.паром..Э..Рязанова 0 8 2 9 4 9 8 1
## X.Тупой.и.ещё.тупее. 4 5 6 7 2 7 5 1
wij= cor(table_rating2, use="pairwise.complete.obs")
head(wij,n=6L)
## 1 2 3 4 5 6
## 1 1.0000000 -0.1668522 -0.47637553 -0.33984519 -0.2341074 -0.9333500
## 2 -0.1668522 1.0000000 0.11975001 0.79615630 0.4219249 0.2726080
## 3 -0.4763755 0.1197500 1.00000000 0.09574468 1.0000000 0.9146591
## 4 -0.3398452 0.7961563 0.09574468 1.00000000 0.5815158 0.2690977
## 5 -0.2341074 0.4219249 1.00000000 0.58151575 1.0000000 0.6425896
## 6 -0.9333500 0.2726080 0.91465912 0.26909772 0.6425896 1.0000000
## 7 8 9 10 11 12
## 1 -0.09041470 -0.284267622 0.63647936 0.93653651 -0.4054501 0.3333333
## 2 0.47407344 0.005580876 -0.05781216 0.36436200 0.2491089 0.3140631
## 3 -0.04917108 NA -0.91766294 -0.71400555 0.1147079 0.1147079
## 4 0.65620414 0.214440632 0.15952503 0.33558780 0.3249845 0.7122391
## 5 0.24287225 0.414572843 0.29649973 0.18404255 0.5802885 0.2100420
## 6 0.17412357 0.129865889 0.00000000 0.06727215 0.4709963 0.7060993
## 13 14 15 16 17 18
## 1 0.02013434 -0.25573140 0.2972835 NA -0.5195887 -0.2444666
## 2 0.08333333 0.20436528 0.4139187 -0.1783693 0.4515634 0.3413385
## 3 -0.36288737 0.20628425 0.6324555 NA 0.1147079 0.6456498
## 4 0.11278231 0.21566163 0.5533459 -0.2352616 0.7454500 0.3246508
## 5 -0.14258086 -0.04277926 0.7059267 -0.1716919 0.2384503 0.1515897
## 6 0.31069393 -0.13665204 0.8413772 0.4644204 0.6626278 0.4420922
## 19 20 21 22 23 24
## 1 0.86463890 -0.3855296 0.4671657 -0.3828762 0.23929908 -0.6225614
## 2 0.39031520 0.6064824 -0.3283229 0.3814992 -0.26104689 0.4503722
## 3 -0.30851064 0.7783041 0.2947532 -0.2264101 0.36184651 0.2094204
## 4 0.21490591 0.4814406 -0.2036527 0.3457324 -0.06585764 0.2922544
## 5 0.40068396 0.6265294 0.1788050 0.0560112 0.12290727 0.4584447
## 6 0.03573247 0.2041005 -0.6237611 0.3026714 0.21479111 0.1886440
## 25 26
## 1 -0.3631142 0.13842360
## 2 0.5623331 0.46095209
## 3 0.3714633 NA
## 4 0.4828667 0.30667214
## 5 0.4003032 0.09081143
## 6 0.3840323 -0.01812027
collaborative_filtering <- function(i, k, rating_matrix=table_rating2, n)
{
mean_rating = mean(rating_matrix[,i], na.rm = T)
#print(rating_matrix[,i])
w = cor(rating_matrix, use = "pairwise.complete.obs")
wi = w[,i]
#print(wi)
all_nearby = abs(order(wi,decreasing=T))[-1]
n_nearby = all_nearby[1:n]
sum = 0
alpha_c = 0
ct=0
sum_all=0
for (j in n_nearby)
{ if (!is.na(rating_matrix[k,j])){
sum_all = w[i,j]*(rating_matrix[k,j] - mean(rating_matrix[,j], na.rm = T))
sum = sum + sum_all
alpha_c =alpha_c + abs(w[i,j])
} else {ct=ct+1}
}
if (ct==n)
{ stop("У ближайших соседей данного пользователя, нет оценок для фильма")
} else {
alpha = 1/alpha_c
user_rating= mean_rating + alpha*sum
return(user_rating)
}
}
cat("Рейтинг фильма ",rownames(table_rating2)[7], "=")
## Рейтинг фильма X.Маска. =
collaborative_filtering(1,7,,3)
## [1] 8.662918
for(f in 1:6){
cat("Рейтинг фильма ",rownames(table_rating2)[f], "=", collaborative_filtering(1,f,,3),"\n")
}
## Рейтинг фильма X.Птицы..Хичкока = 9.087302
## Рейтинг фильма X.Трансформеры. = 8.941256
## Рейтинг фильма X.Терминатор.2. = 6.741939
## Рейтинг фильма X.Красота.по.американски. = 9.249228
## Рейтинг фильма X.Ирония.судьбы.или.с.лёгким.паром..Э..Рязанова = 5.323135
## Рейтинг фильма X.Тупой.и.ещё.тупее. = 6.741939
На мой взгляд, оценки, полученные данными фильмами, получаются завышенными, что может говорить о неадекватности предсказаний рейтингов.
collaborative_filtering2 <- function(i, k, rating_matrix = table_rating2, n) {
mean_rating = mean(rating_matrix[,i], na.rm = T)
rated = which(!is.na(rating_matrix[k,])) #получаем вектор с испытуемыми, которые оценили k фильм
#print(rating_matrix[i,])
w = cor(rating_matrix, use = "pairwise.complete.obs")
wi = w[,i]
#print(wi)
all_nearby = abs(order(wi[rated],decreasing=T))[-1] #выбираем всех соседей среди испытуемых, которые оценили k фильм
n_nearby = all_nearby[1:n]
sum = 0
alpha_c = 0
ct=0
sum_all=0
for (j in n_nearby)
{ if (!is.na(rating_matrix[k,j])){
sum_all = w[i,j]*(rating_matrix[k,j] - mean(rating_matrix[,j], na.rm = T))
sum = sum + sum_all
alpha_c =alpha_c + abs(w[i,j])
} else {ct=ct+1}
}
if (ct==n)
{ stop("У ближайших соседей данного пользователя, нет оценок для фильма")
} else {
alpha = 1/alpha_c
user_rating= mean_rating + alpha*sum
return(user_rating)
}
}
cat("Рейтинг фильма ",rownames(table_rating2)[7], "=")
## Рейтинг фильма X.Маска. =
collaborative_filtering2(1,7,,3)
## [1] 7.936942