Pull to refresh

Comments 20

UFO just landed and posted this here
Не профит. При небольшом объеме данных от пользователя, круг рекомендаций будет очень узкий. Допустим, если меня спросят топ10 любимых фильмов, там скорее всего не будет комедий или приключений. Соотвественно, даже оценивая то, что мне будет предлагаться, таким способом, до комедий я могу вообще не добраться.

С другой стороны, при небольшом количестве оценок от пользователей, этот метод показывает гораздо более адекватные результаты.

Лучше смешивать. Пока данных мало, брать похожие по вашему алгоритму, когда становится больше — добавлять вес данным на основе предпочлений пользователей. Со временем, превалировать должны последние.
есть такие рекомендационные системы, которые учитывают метаданные и даже пытаются делать что-то умное с темантическими онтологиями. Но я еще не видел, чтобы такие рекомендации рвали в клочья более традиционные и тупые подходы вроде колл.фильтрации
> Не так давно компания Netflix проводила конкурс с призовым фондом в 1 миллион долларов, задачей которого стояло улучшение алгоритма рекомендации фильмов (подробнее).

в 2007м году. я даже писал обзорный реферат, чтобы сдать «современные проблемы прикладной математики», в котором кратко максимально простым языком попытался описать:
Регулярное разложение по сингулярным значениям (RSVD – regularized singular value decomposition)
Улучшенный RSVD
Оценка с помощью кластеризации методом K-средних
Пост-обработка результатов RSVD с помощью поиска ближайших соседей
Пост-обработка результатов RSVD с помощью регуляризации Тихонова (kernel ridge regression)
Ограниченная машина Больцмана

если кому интересно
эх, хорошо, но можно было бы и потщательнее пережевать :)
Интересно, что решение, выигравшее миллион долларов, так и не было внедрено в production, подробнее в статье:
«If you followed the Prize competition, you might be wondering what happened with the final Grand Prize ensemble that won the $1M two years later. This is a truly impressive compilation and culmination of years of work, blending hundreds of predictive models to finally cross the finish line. We evaluated some of the new methods offline but the additional accuracy gains that we measured did not seem to justify the engineering effort needed to bring them into a production environment. Also, our focus on improving Netflix personalization had shifted to the next level by then. In the remainder of this post we will explain how and why it has shifted.»
спасибо за статью, я все ещё пишу свой рекомендательный сервис и решил поспрашивать

Давайте рассмотрим Алекса, Ивана и Давида
Группа №1: у Алекса и Ивана одно пересечение №1, оценки 5 и 4 соответственно
Группа №2: у Алекса и Давида одно пересечение №6, оценки 1 и 2 соответственно

Первой группе обоим нравится один фильм, а второй обоим один фильм не нравится

Косинусная мера считает, что Группа №1 в десять раз более схожая, чем Группа №2
Мне кажется, что тут явная логическая ошибка… Как бы вы могли прокомментировать данное поведение(если можно с живыми примерами)?

Тут явная математическая ошибка, причем у вас, а не у автора: вы забыли поделить на произведение модулей.
А, все, понял о чем вы. Все-таки у автора ошибка… Модуль надо считать только на общем базисе, а не на всем наборе оценок.

def distCosine (vecA, vecB):
    def dotProduct (x, y):
        d = 0.0
        for dim in vecA:
            if dim in vecB:
                d += x[dim]*y[dim]
        return d
    return dotProduct (vecA,vecB) / math.sqrt(dotProduct(vecA,vecA)) / math.sqrt(dotProduct(vecB,vecB))


Вот так правильнее будет.
В предыдущем топике автора я уже поднимал вопрос странности косинусной метрики:
Мои данные
__Id_|__Косинусная метрика_|_Евклидово расстояние
(11382, (0.9945617655513243, 6.0))
(25881, (0.9946889722415817, 10.44030650891055))
(32657, (0.9948579893001871, 4.58257569495584))
(11642, (0.9949290831814581, 4.898979485566356))
(29796, (0.9950464316093013, 5.656854249492381))
(31417, (0.9951124675317691, 6.782329983125268))
(40530, (0.9952102629001573, 4.58257569495584))
(8311, (0.9952136477352348, 5.830951894845301))
(37772, (0.995641393209143, 4.47213595499958))
(11087, (0.9964597867088298, 4.795831523312719))
(9641, (0.996734136199907, 3.7416573867739413))
(9651, (0.9969863072847556, 30.04995840263344))
(22462, (0.9972173920027746, 3.3166247903554))
(6309, (0.9999999999999999, 0.0))

Почему-то появился объект 9651(третий с конца) хотя у него оценки сильно разнятся
Автор ответил:
По поводу использования метрик: предположим, у нас есть три вектора (10, 10, 1), (1, 1, 0) и (0, 0, 1). Согласно евклидовому расстоянию наиболее близки вектора 2 и 3, а по косинусной метрике — 1 и 2, что более корректно.
Выбор метрики обусловлен конкретной задачей

я так и не понял почему это более коректно

Это более корректно, так как (1, 1, 0) и (0, 0, 1) вообще не имеют общих оценок. Допустим, один человек посмотрел фильмы «Аватар» и «Бэтмен» и поставил им оценку «1», а другой — фильм «Начало» и поставил ему «1». И первому порекомендуют посмотреть фильм «Начало» на основании данных второго пользователя, хотя они смотрят совсем разные фильмы и вкусы из скорее всего расходятся
В данном случае под «0» понимается не какая-либо оценка, а отсутствие оценки — это допущение, которое необходимо для работы косинусной меры и евклидова расстояния. Если при вычислении расстояния использовать только совпадающие оценки, не будет учитываться общее количество оценок, и пользователь с оценками (1, 0, 0, 0, 0, 0, 0) будет одинаково похож как на (1, 1, 0, 0, 0, 0, 0), так и на (1, 1, 1, 1, 1, 1, 1)
В целом, косинусная мера — это именно косинус угла между векторами, а для вычисления его используется полная длина векторов, а не только длина по совпадающим измерениям
Вопрос выбора метрики нетривиален, его я хочу описать в отдельной статье. Это, действительно, один из недостатков косинусной меры. Вместо неё можно использовать тот же коэффициент корреляции Пирсона, но и он не идеален: так как боб поставил всего две оценки и обе они являются пятерками, то дисперсия его оценок равна нулю и коэффициент корреляции не определен, так что в формулу вычисления коэффициента корреляции придется добавлять сглаживающие коэффициенты.
Также можно произвести бинаризацию оценок: оценки больше или равные мат. ожиданию оценки данного пользователя заменяются на «1», а меньшие на «0». После этого можно будет применить одну из следующих мер: Жаккарда, Танимото и т.д.
В целом, выбор меры зависит от конкретной задачи, а корректность выбранной меры можно проверить тем же k-Fold + RMSE. Иногда оказывается полезно использовать линейную комбинацию нескольких мер + средний рейтинг продукта, коэффициенты можно подобрать при помощи линейной регрессии
Если рассматривать оценку на шкале от 1 до 5 звездочек и считать оценку 5 за «отлично», а 1 за «ужасно», то перед использованием косинусной меры можно произвести нормализацию оценок, вычтя из оценки мат. ожидание. Если принять мат. ожидание за 3.0 и не обращать внимание на проблему с нулевым вектором предпочтений для человека, который всем продуктам ставит 3.0, то мы получим следующий код:
def distCosine (vecA, vecB):
    def dotProduct (x, y):
        d = 0.0
        for dim in x:
            if dim in y:
                d += (x[dim]-3.0)*(y[dim]-3.0)
        return d
    return dotProduct (vecA, vecB) / math.sqrt(dotProduct(vecA,vecA)) / math.sqrt(dotProduct(vecB,vecB))

Он показывает схожесть Ивана с Алексом 0.3651, а с Дэвидом 0.3333

В то же время нужно понимать, что рекомендательные системы могут строиться на основании разных данных, и если в одной задаче мы оперируем с оценками «от 1 до 5 звездочек», то в другой задаче это может быть «1 для просмотра и 2 для покупки», в третьей — «количество фактов оказания услуги». В каждой из таких систем должен быть свой подход к подготовке данных и выбору меры сходства
я не сделал ни одного математического действия
я ошибся во второй группе, там Иван и Давид(у Алекса и Давида вообще нет пересечений)
все остальные числа из статьи:
схожесть группы №1 = 0.51
схожесть группы №2 = 0.06
Согласен. В обоих случаях разница в 1 балл, но в разную сторону. При этом влияние мнения Алекса отличается на порядок, благодаря чему, предлагается то, что рекомендует Алекс.

Сразу видно, что вы читали книгу Тоби Сегарана. Это очень хорошая и даже в какой-то степени уникальная книга
Правда в коде есть существенные опечатки, особенно в разделе про вычисление коэффициента подобия используя евклидову метрику.
О, спасибо, записал ISBN 5932861193.
UFO just landed and posted this here
Sign up to leave a comment.

Articles