Мне нужно реализовать следующий алгоритм совместной фильтрации элементов-элементов в 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"))
})
})
Заранее спасибо!
Аниш Сах