1 Написать функцию, реализующую простейший алгоритм коллаборативной фильтрации (находящий рейтинг фильма k для испытуемого i по оценкам фильмов, выставленных n ближайшими к i-му испытуемому соседями, и матрице оценок фильмов rating_matrix):

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

2. Применить указанную функцию для предсказания рейтингов фильмов, которые не были оценены некоторыми пользователями, по загруженной ранее из файла матрице рейтингов. Оценить адекватность предсказаний рейтингов, полученных с помощью указанной реализации алгоритма.

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

На мой взгляд, оценки, полученные данными фильмами, получаются завышенными, что может говорить о неадекватности предсказаний рейтингов.

3.Изменить функцию так, чтобы для осуществления прогноза сначала выбирались те пользователи, которые оценили фильм k, а n ближайших соседей определялись именно среди них.

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