set.seed(2010)
## Simulation settings
n_users <- 200 # number of users
n_items <- 300 # number of items
K_true <- 4 # true number of latent factors
sparsity <- 0.25 # ~5% of user-item pairs are observed
## True parameters
mu <- 3.5
a_true <- rnorm(n_users, 0, 0.3) # user effects
b_true <- rnorm(n_items, 0, 0.4) # item effects
p_true <- matrix(rnorm(n_users * K_true, 0, 0.5), n_users, K_true)
q_true <- matrix(rnorm(n_items * K_true, 0, 0.5), n_items, K_true)
names(a_true) <- 1:n_users
names(b_true) <- 1:n_items
rownames(p_true) <- 1:n_users
rownames(q_true) <- 1:n_items
## Generate observed ratings matrix with sparsity
user_id <- rep(as.character(1:n_users), each = n_items)
item_id <- rep(as.character(1:n_items), times = n_users)
## Which entries are observed?
obs <- runif(length(user_id)) < sparsity
## Ratings with noise
rating_full <- mu + a_true[user_id] + b_true[item_id] +
rowSums(p_true[user_id, ] * q_true[item_id, ]) +
rnorm(length(user_id), 0, 0.25)
rating <- rating_full[obs]
user_id <- user_id[obs]
item_id <- item_id[obs]
## Call your recommender function
fit <- fit_recommender_model(rating, user_id, item_id, K = 4, reltol = 1e-5,
min_ratings = 5, verbose = TRUE)
plot(fit$fitted, rating)
Run the code above in your browser using DataLab