Отказ от ответственности : Это может быть чисто вопрос R, но я подумал, что выложу его здесь с целью.
Используя меньшее подмножество movielens данных, я Я пытаюсь оштрафовать фильмы с низкой оценкой на lambdas
и едва оцениваю пользователей на zetas
отдельно:
library(tidyverse)
library(dslabs)
data("movielens")
RMSE_adj <- function(l, z){
dat <- movielens #data set
mu <- mean(dat$rating) #mean
b_i <- dat %>%
group_by(movieId) %>%
summarize(b_i = sum(rating - mu)/(n()+l))
b_u <- dat %>%
left_join(b_i, by="movieId") %>%
group_by(userId) %>%
summarize(b_u = sum(rating - b_i - mu)/(n()+z))
predicted_ratings <-
dat %>%
left_join(b_i, by = "movieId") %>%
left_join(b_u, by = "userId") %>%
mutate(pred = mu + b_i + b_u) %>%
pull(pred)
return(sqrt(mean((dat$rating - predicted_ratings)^2)))
}
lambdas <- seq(0, 10, 0.25)
zetas <- seq(0,10, 0.25)
rmses1 <- mapply(RMSE_adj, lambdas, zetas)
Однако в MSE нет никаких улучшений по сравнению с использованием лямбд, о чем свидетельствуют только
lambdas[which.min(rmses1)]
[1] 0.25
zetas[which.min(rmses1)]
[1] 0.25
Я подозреваю, что проблема заключается в функции mapply
, которая используется попарно, т. Е. Для каждого l=0.5
она вытянет z
, например z=0.5
, когда списки равны. Нужно ли использовать какую-то вложенную функцию apply
для обхода?