Комментарии 5
Спасибо, очень интересно. Давно хотел понять как применяют глубокое обучение в рекомендательных системах. У Вас есть результаты сравнения со стандартными подходами?
0
Здравствуйте! Я новичок в ML, было бы интереснее, если бы Вы снабжали текстовые описания примерами.
Допустим, для описания работы autoencoder-ов — что подаем, что получаем на выходе.
Спасибо.
Допустим, для описания работы autoencoder-ов — что подаем, что получаем на выходе.
Спасибо.
0
1) Запустите (или проанализируйте) исходный код. В начале подготовку данных, затем само обучение. Посмотрите какие данные как задаются/используются, проследите потоки данных. Код — наиболее точное описание подхода. Код написан, несколько не оптимально, но старался, чтобы демонстрация хорошо показывала потоки данных. (Не переписывал многие операции на GPU, чтобы в простом отладчике можно было наблюдать потоки данных.)
2) Задавайте вопросы. Объясню. Меня можно найти во вконтакте, по gmail.com.
Вот код, который инициализирует один из autoencoder-ов
Посмотрите комментарии к коде, которые описывают то, как происходит заполнение входов autoencoder-а.
Ссылка на исходник, фрагмент которого приведен выше (строка 320 и далее, функция def train_encoders(...)).
2) Задавайте вопросы. Объясню. Меня можно найти во вконтакте, по gmail.com.
Вот код, который инициализирует один из autoencoder-ов
user_idx1 = self.rng.randint(low=0 ,high = len(self.ratings_by_user_idx))
# получили случайный индекс данных из рейтингов отсортированных по пользователю
# фактически, выбрали пользователя, чтобы работать с ним
curr_user_idx_index = curr_user_idx_index = self.ratings_by_user_idx[user_idx1,0]
# получили индекс на начало блока сгрупированных пользователей в векторах идентификаторов пользователей и в данных о пользователе
values = []
user_id = self.ratings_by_item_ids[curr_user_idx_index,self.user_indice] - 1
# получили идентификатор пользователя (не вектор из N значений, а просто индекс)
for k in numpy.arange(self.encoder_elements_count):
# задаем K значений (5) данных о продукте для одного пользователя
item_idx1 = self.rng.randint(low = 0,high = self.ratings_by_user_idx[user_idx1,1]-curr_user_idx_index)
# получили случайный индекс
rating_by_user_offs = curr_user_idx_index+item_idx1
# получили смещение в групировке рейтингов по пользователям
#user_id = self.ratings_by_user_ids[rating_by_user_offs,0] - 1
item_id = self.ratings_by_user_ids[rating_by_user_offs,self.movie_indice] - 1
# получаем индекс продукта для уже выбранного пользователя (пользователь оценил данный продукт и в системе есть рейтинг продукта)
values.append((self.items_ids[item_id,],self.itemsids_data[item_id,],self.ratings_by_user[rating_by_user_offs,]))
# добавили в значения 1) вектор идентификаторов; 2) вектор данных о продукте; 3) данные о рейтингах и сам рейтинг данного продукта выбранным пользователем
values = sorted(values,key = lambda x : x[2][0])
# отсортировали список по рейтингу (в начале минимальный рейтинг, далее больше)
for k in numpy.arange(self.encoder_elements_count):
i0 = (self.itemsids_data.shape[1]+self.item_id_size+self.ratings_by_user.shape[1])*k #
i1 = i0 + self.item_id_size
x_value[j,i0:i1] = values[k][0]
i0 = i1;
i1 = i1 + self.itemsids_data.shape[1]
x_value[j,i0:i1] = values[k][1]
i0 = i1
i1 = i1 + self.ratings_by_item.shape[1]
x_value[j,i0:i1] = values[k][2][0]
# это код копирования данных в один вектор, который задается на вход autoencoder-а.
Посмотрите комментарии к коде, которые описывают то, как происходит заполнение входов autoencoder-а.
Ссылка на исходник, фрагмент которого приведен выше (строка 320 и далее, функция def train_encoders(...)).
-1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Использование autoencoder-ов для построения рекомендационной системы