Как реализовать совместную фильтрацию + усреднение базовой линии в R с помощью API Recommender? - PullRequest
0 голосов
/ 10 марта 2019

Мне нужно реализовать следующий алгоритм совместной фильтрации элементов-элементов в R, используя встроенный API Recommender, который может работать даже с большими наборами данных, такими как наборы данных MovieLens.

Среднее значение фильма + (Σ (аналогичный фильм)рейтинг - среднее значение для фильма) * сходство по центрированному косинусу) / сходство по центрированному косинусу

Используя этот алгоритм, я хочу прогнозировать все оценки в наборе случайных тестовых данных 1/5 от всех пользователей, созданных с помощью перекрестной проверки.

Хотя мне удалось написать R-код для того же самого, он хорошо работает на небольшом наборе данных из 25 пользователей и 100 фильмов, но когда я пробую то же самое на наборе данных объектива фильма с примерно 9724 фильмами, язастрял в расчете самой корреляционной матрицы Пирсона.

Я нашел функции в пакете rrecsys для реализации либо совместной фильтрации элементов, либо усреднения по базовой линии, но не обоих!

Любая помощь будет принята с благодарностью!

for(user in 1:ncol(test1)){ 
                      for(movie in 1:nrow(test1)){
                      NN_indices <- ordered_similar_movies(movie,train1_index)
                      similarities <- sim_mat[NN_indices,movie]
                      similarities <- similarities[similarities >=0.3 & !is.na(similarities)]
                      KNN_indices <- sim_mat[NN_indices,movie] %in% similarities
                      KNN <- NN_indices[KNN_indices]
                      selected_ratings <- ratings[KNN,this_user+1]
                      rated_movies <- which(!is.na(selected_ratings))
                      rated_highest_similarities_indices <- KNN[rated_movies]
                      rated_highest_similarities <- sim_mat[rated_highest_similarities_indices,movie]
                      selected_ratings <- selected_ratings[rated_movies]
                      avg_movie_rating <- rowMeans(train1[movie,],na.rm = TRUE)
                      prediction1[movie,user] <- avg_movie_rating  +  (
                                            rated_highest_similarities %*% (selected_ratings - movie_means[rated_movies])) 
                                       /sum(rated_highest_similarities)   }}  

Код для расчета корреляции:

sim_mat <- sapply(1:100,function(i){
                       sapply(1:100,function(j){ 
cor(unlist(train1[i,]),unlist(train1[j,]),use = "complete.obs",method = c("pearson"))                                                          
})
})

Заранее спасибо!

Аниш Сах

...