«Проблема» с 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'ам). Это должно сделать алгоритм не таким консервативным к отсутствующим оценкам.
Item-вектора, которые мы получаем из User-Item матрицы и на основании которых мы потом считаем косинус угла, тоже разрежены как и сама матрица. Встает вопрос, что делать с пустыми позициями векторов. Есть два решения, которые лежат «на поверхности» (заполнять нулями или брать только позиции заполненные в обоих векторах), но оба они по-своему плохи. Интересно, как поступаете вы?
Основная сила ES лежит конечно же в Lucene. Очень продвинутая библиотека для работы с инвертированным индексом. Мы его эксплуатируем уже лет 5. В данный момент в эксплуатации кластер из ~20 машин. За это время пришли к архитектуре во многом похожей на ES, но в некоторых аспектах существенно отличающейся. В частности, мы храним документы отдельно, а не в индексе. А также, координацией поиска внутри кластера и индексацией занимаются отдельные машины. Это позволяет более «экономно» масштабировать систему.
Спасибо за статью. Мы тоже используем maven для организации CI-цикла, вполне довольны. Более подробно свой опыт описывал у себя в блоге – Маленький Билд и его друзья
Хорошая статья, спасибо. Я у себя в блоге тоже описал байесовский классификатор, но с большим упором на теорию. В частности более подробно написал про проблему неизвестных слов (additive smoothing, то зачем вы использовали 10^-7).
Во-втором случае вектора, дальше друг от друга (item'ы менее похожи). Но это, на мой вгляд не совсем правомерно, ведь у нас просто нет оценки по одному Item'у. Потенциально, там могла быть 5-ка, что опять нас привело бы к единичной косинусной мере. Возможно, хорошей альтернативой было бы не занулять, а «засреднять» оценки. То есть, заполнять пустые ячейки матрицы средней оценкой Item'а, или средней оценкой целовека (по всем item'ам). Это должно сделать алгоритм не таким консервативным к отсутствующим оценкам.