Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Рекомендательные системы: классификация и алгор...

Рекомендательные системы: классификация и алгоритмы

Артем Безукладичный
В докладе рассматриваются основные типы рекомендательных систем, шаги при обработке данных и способы проверки качества получаемых рекомендаций. Более подробно будут представлены алгоритмы коллаборативной фильтрации и результаты их сравнения.

Moscow Python Meetup

January 25, 2013
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Рекомендации — проблема. Рекомендательные системы (РС) — программы, которые пытаются

    предсказать, какие объекты будут интересны пользователю. Примеры: • Товары (Amazon.com) • Фильмы (Netflix) • Музыка (Last.fm) • etc
  2. Актуальность • Возрастает сложность выбора • Возрастает количество информации •

    Существует спрос (Netflix, Last.fm) • Мало доступной информации о РС • Нет единого стандарта, платформы РС • Интерес Google, IBM, Microsoft, Nokia, Oracle • Ограниченные возможности РС
  3. 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009

    2010 2011 2012 0 100 200 300 400 500 600 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000
  4. Типы РС • Основанные на содержании (content-based) • Коллаборативные •

    Основанные на знаниях (knowledge-based) • Гибрибные
  5. Сontent-based RS • Рекомендуют, то что понравилось раньше Плюсы •

    Не зависит от других пользователей • Прозрачность • Простота добавления новых объектов Минусы: • Ограниченные возможности анализатора содержания • Рекомендации новых областей • Сложности при новых пользователях
  6. Коллаборативные РС • Рекомендуют, то что понравилось «соседям» Плюсы: •

    Простота алгоритмов • Простота объяснения • Стабильность Минусы: • Производительность • Черный ящик • Холодный старт
  7. Knowledge-based RS • Основывается на дополнительной информации об объектах Плюсы:

    • Нет холодного старта Минусы: • Дополнительная информация
  8. Гибридные РС • Монолитные • Параллельные rec(u,i) = a*rec1 (u,i)

    + b*rec2 (u,i) • Последовательные РС РС1 РС2 РС1 РС2
  9. Критерии оценки РС • Точность • Ограничение(количество инф/точность) • Доверие

    • Неожиданность • Разнообразие • Устойчивость к атакам • Приватность • Адаптивность • Масштабируемость
  10. Netflix Prise • 2006 — 2009 • 1 M$ •

    RMSE 0.95 — 0.85, 10% • 100 M оценок, 500 К пользователей, 17 К фильмов • Training set (99,072,112 ratings) • Qualifying set (2,817,131 ratings)
  11. Мои тестовые данные • 30к случайных пользователей из 200к •

    3М оценок из 30М • Для каждого пользователя: • Среднее значение 1.53/1.09 • Больше баллов больше rmse (N — 6) оценок Обучающая выборка 6 оценок Проверяющая Время, t
  12. User-based коллаборативная РС Метрики сходства (similarity metrics): sim = f(

    u1, u2) • Корреляция Пирсона • Косинусная метрика • Моя - sim = cross_count / euclid
  13. user_basis_array = init_array(users_count) item_basis_array = init_array(items_count) user_p_array = init_2d_array(users_count, factors)

    item_q_array = init_2d_array(items_count, factors) rate = 0.01 regularization = 0.1 mean_score = 7 def get_predict(row, col): predict_score_basis = mean_score + item_basis_array[row] + user_basis_array[col] svd_predict = dot(item_q_array[row], user_p_array[col]) return predict_score_basis + svd_predict def get_error(row, col, real_score): predict_score = get_predict(row, col) return real_score - predict_score data = [] columns = [] rows = []
  14. while curent_error < (last_error - 0.001): epoch_error = 0 for

    i in range(0,data_len): score = data[i] user_index = columns[i] item_index = rows[i] error = get_error(item_index, user_index, score) bu = user_basis_array[user_index] user_basis_array[user_index] = bu + rate*(error - regularization*bu) bi = item_basis_array[item_index] item_basis_array[item_index] = bi + rate*(error - regularization*bi) pu = user_p_array[user_index] qi = item_q_array[item_index] for f in range(0,factors_len): pu_f = pu[f] qi_f = qi[f] user_p_array[user_index][f] = pu_f + rate*(error*qi_f - regularization*pu_f) item_q_array[item_index][f] = qi_f + rate*(error*pu_f - regularization*qi_f) epoch_error += error*error last_error = curent_error curent_error = sqrt( epoch_error/data_len)