Pull to refresh

Comments 13

Спасибо за статью!

А вы вроде раньше какой-то сторонний сервис использовали для этого? :)
Да, и до сих пор используем. Но он перестает удовлетворять нашим требованиям, поэтому решили написать свой.
Кто такой Пользователь: это 1) залогиненный юзер, или 2) просто сессия на девайсе?

Понимаю, что процесс эволюции может быть не быстрым. Посему пример для моего вопроса: На моём рабочем планшете есть приложение с аккаунтом, и там будет работать подборка. В телевизоре тоже приложение, но на телике ребёнок смотрит мультики. Что будет в вашем случае алгоритм показыать?
Вот это кстати важный вопрос =)
Если пользователь — залогиненный юзер, то у него есть «постоянная» история просмотров/рейтингов/и т.д… Если история действий достаточно информативна, то персонализированные рекомендации строятся по ней.

Если пользователь не залогинен, то у него «временная» история, которая истечет по завершению сессии. Рекомендации строятся по «временной» истории, если она достаточно информативна.

Если истории не информативна или ее нет, то вместо персонализированных рекомендаций обычно используют тематические блоки или «популярное».
UFO just landed and posted this here
а почему именно коллаборативная фильтрация, а не ассоциативные правила, FPG, например?
Ассоциативные правила обычно используются для определения какие объекты смотрятся совместно с каким-то (т.е ассоциируются). Поэтому ассоциативные правила чаще используют для построения неперсонализированных рекомендаций. А в топике описана только персонализированная RS.

Про FPG до это не слышал, буду благодарен, если поделитесь ссылкой.
Item-вектора, которые мы получаем из User-Item матрицы и на основании которых мы потом считаем косинус угла, тоже разрежены как и сама матрица. Встает вопрос, что делать с пустыми позициями векторов. Есть два решения, которые лежат «на поверхности» (заполнять нулями или брать только позиции заполненные в обоих векторах), но оба они по-своему плохи. Интересно, как поступаете вы?
Мне кажется, что плох, только случай забора позиций заполненный в обоих векторах.

При подсчете схожести важно, чтобы похожими считались фильмы у которых почти одинаковые наборы пользователей. При этом важно избежать «эффекта Гарри Поттера», когда фильм, который просмотрели все пользователи был бы сильно похож на каждый фильм в коллекции.

В обоих предложенных вариантах(заполнять нулями или брать только позиции заполненные в обоих векторах) при вычислении косинусной меры числитель будет одинаковым. Знаменатель будет разный, но только в первом случае он позволит избежать описанные выше эффект.
«Проблема» с cosine similarity в моем понимании заключается в консервативности самой метрики. Проще наверное продемонстрировать на примере:

  • пара Item-векторов {0, 5} и {0, 5} имеет cosine similarity = 1;
  • пара Item-векторов {5, 5} и {0, 5} имеет cosine similarity = 1/sqrt(2);

Во-втором случае вектора, дальше друг от друга (item'ы менее похожи). Но это, на мой вгляд не совсем правомерно, ведь у нас просто нет оценки по одному Item'у. Потенциально, там могла быть 5-ка, что опять нас привело бы к единичной косинусной мере. Возможно, хорошей альтернативой было бы не занулять, а «засреднять» оценки. То есть, заполнять пустые ячейки матрицы средней оценкой Item'а, или средней оценкой целовека (по всем item'ам). Это должно сделать алгоритм не таким консервативным к отсутствующим оценкам.
Ок, рассмотрим ситуацию. Есть контент, который вам совсем не нравится. И, так как вы его не ищите и не смотрите, оценка у него — None. Усредненное значение рейтинга — это попытка найти границу между тем, что вам нравится или не нравится. Т.е указание некоторого безразличия относительно объекта. Таким образом мы строим вам рекомендации, основываясь на фильме, который система считает нейтральным, а вам он не нравится. Мне кажется, что это так себе решение.

Другое дело, что рейтингов может быть мало и схожесть посчитается плохо. Но это можно исправить кучей способов, например:
  • оценивать два фильма только если у них не менее X общих рейтингов;
  • предлагать пользователям пооценивать фильмы с маленьким количеством рейтингов;
  • учитывать просмотры пользователя. тут, кстати, можно использовать средний рейтинг пользователя, если он просмотрел фильм, но не оценил его;
  • использовать демпфирование;
  • и т.д.
Sign up to leave a comment.