Наказанные наименьших квадратов в R - PullRequest
0 голосов
/ 08 февраля 2020

Отказ от ответственности : Это может быть чисто вопрос 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 для обхода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...