Комментарии 20
Не профит. При небольшом объеме данных от пользователя, круг рекомендаций будет очень узкий. Допустим, если меня спросят топ10 любимых фильмов, там скорее всего не будет комедий или приключений. Соотвественно, даже оценивая то, что мне будет предлагаться, таким способом, до комедий я могу вообще не добраться.
С другой стороны, при небольшом количестве оценок от пользователей, этот метод показывает гораздо более адекватные результаты.
Лучше смешивать. Пока данных мало, брать похожие по вашему алгоритму, когда становится больше — добавлять вес данным на основе предпочлений пользователей. Со временем, превалировать должны последние.
С другой стороны, при небольшом количестве оценок от пользователей, этот метод показывает гораздо более адекватные результаты.
Лучше смешивать. Пока данных мало, брать похожие по вашему алгоритму, когда становится больше — добавлять вес данным на основе предпочлений пользователей. Со временем, превалировать должны последние.
есть такие рекомендационные системы, которые учитывают метаданные и даже пытаются делать что-то умное с темантическими онтологиями. Но я еще не видел, чтобы такие рекомендации рвали в клочья более традиционные и тупые подходы вроде колл.фильтрации
> Не так давно компания Netflix проводила конкурс с призовым фондом в 1 миллион долларов, задачей которого стояло улучшение алгоритма рекомендации фильмов (подробнее).
в 2007м году. я даже писал обзорный реферат, чтобы сдать «современные проблемы прикладной математики», в котором кратко максимально простым языком попытался описать:
Регулярное разложение по сингулярным значениям (RSVD – regularized singular value decomposition)
Улучшенный RSVD
Оценка с помощью кластеризации методом K-средних
Пост-обработка результатов RSVD с помощью поиска ближайших соседей
Пост-обработка результатов RSVD с помощью регуляризации Тихонова (kernel ridge regression)
Ограниченная машина Больцмана
если кому интересно
в 2007м году. я даже писал обзорный реферат, чтобы сдать «современные проблемы прикладной математики», в котором кратко максимально простым языком попытался описать:
Регулярное разложение по сингулярным значениям (RSVD – regularized singular value decomposition)
Улучшенный RSVD
Оценка с помощью кластеризации методом K-средних
Пост-обработка результатов RSVD с помощью поиска ближайших соседей
Пост-обработка результатов RSVD с помощью регуляризации Тихонова (kernel ridge regression)
Ограниченная машина Больцмана
если кому интересно
Подробнее про решение Bellkor, выигравших Netflix Prize
Мне понравились их регрессионные модели, т.к. у меня диплом был на эту тем.
Время быстро летит, казалось вот только недавно 2009 был :)
Мне понравились их регрессионные модели, т.к. у меня диплом был на эту тем.
Время быстро летит, казалось вот только недавно 2009 был :)
Интересно, что решение, выигравшее миллион долларов, так и не было внедрено в 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.»
«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
Мне кажется, что тут явная логическая ошибка… Как бы вы могли прокомментировать данное поведение(если можно с живыми примерами)?
Давайте рассмотрим Алекса, Ивана и Давида
Группа №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))
Вот так правильнее будет.
В предыдущем топике автора я уже поднимал вопрос странности косинусной метрики:
Почему-то появился объект 9651(третий с конца) хотя у него оценки сильно разнятся
Автор ответил:
я так и не понял почему это более коректно
Мои данные
__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))
(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)
В данном случае под «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», а меньшие на «0». После этого можно будет применить одну из следующих мер: Жаккарда, Танимото и т.д.
В целом, выбор меры зависит от конкретной задачи, а корректность выбранной меры можно проверить тем же k-Fold + RMSE. Иногда оказывается полезно использовать линейную комбинацию нескольких мер + средний рейтинг продукта, коэффициенты можно подобрать при помощи линейной регрессии
Если рассматривать оценку на шкале от 1 до 5 звездочек и считать оценку 5 за «отлично», а 1 за «ужасно», то перед использованием косинусной меры можно произвести нормализацию оценок, вычтя из оценки мат. ожидание. Если принять мат. ожидание за 3.0 и не обращать внимание на проблему с нулевым вектором предпочтений для человека, который всем продуктам ставит 3.0, то мы получим следующий код:
Он показывает схожесть Ивана с Алексом 0.3651, а с Дэвидом 0.3333
В то же время нужно понимать, что рекомендательные системы могут строиться на основании разных данных, и если в одной задаче мы оперируем с оценками «от 1 до 5 звездочек», то в другой задаче это может быть «1 для просмотра и 2 для покупки», в третьей — «количество фактов оказания услуги». В каждой из таких систем должен быть свой подход к подготовке данных и выбору меры сходства
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 = 0.51
схожесть группы №2 = 0.06
Сразу видно, что вы читали книгу Тоби Сегарана. Это очень хорошая и даже в какой-то степени уникальная книга
Правда в коде есть существенные опечатки, особенно в разделе про вычисление коэффициента подобия используя евклидову метрику.
Правда в коде есть существенные опечатки, особенно в разделе про вычисление коэффициента подобия используя евклидову метрику.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Коллаборативная фильтрация