2016-11-12 6 views
0

Я пытаюсь запустить алгоритм совместной фильтрации (CF) в данных «User-Item-Rating». Мои данные в длинном формате, т.е. каждая строка имеет данные для пользовательского рейтинга определенного элемента. Мне нужно преобразовать это в матрицу «Пользовательский элемент», прежде чем я смогу применить к нему CF-алгоритм.Создание матрицы пользовательских элементов для совместной фильтрации

Я использую функцию spread из пакета tidyr для выполнения этой задачи. Но, учитывая, что у меня есть более чем 50 тысяч уникальных элементов, результирующий фреймворк будет огромным. R не может выполнить это (на моей локальной машине) и выбрасывает ошибку «не может выделить вектор размера».

Каков наилучший способ справиться с этим? Некоторые из вариантов я попытался исследовать, но не смог заставить их работать:

  • Я думаю, если есть способ, чтобы вернуть выход спреда вызова как разреженная матрица
  • Я также попытался исследовать, если пакеты, которые реализуют CF, такие как recommenderlab, имеют возможность справиться с этим. Но я не мог найти для этого никакого варианта.

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

Спасибо!

+0

Чтобы получить больше ответов быстро на R вопросы, это всегда лучше, чтобы добавить немного [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how- к-макияж а-пра-р-воспроизводимый-пример # ответ-5963610). Наведите указатель мыши на тег R под своим сообщением ... – lukeA

ответ

1

Поскольку вы (вероятно) получили разреженные данные, пойдите с разреженной матрицей. Вот пример для 50000 разреженных например оценок:

library(stringi) 
library(Matrix) 
set.seed(1) 
df <- data.frame(item = stri_rand_strings(50000, 4)) 
df$user <- as.factor(1:nrow(df)) 
df$rating <- sample(1:10, nrow(df), T) 
m <- sparseMatrix(
    i = as.integer(df$user), 
    j = as.integer(df$item), 
    x = df$rating, 
    dimnames = list(levels(df$user), levels(df$item)) 
) 
+0

Awesome! это работает. – Dataminer