Создание «соседей» для пользователей на основе рейтинга - PullRequest
10 голосов
/ 30 сентября 2008

Я ищу методы для создания «соседей» (людей с похожим вкусом) для пользователей на сайте, над которым я работаю; что-то похожее на работу last.fm.

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

Одна из моих идей заключалась в том, чтобы просто рассчитать совместимость каждой комбинации пользователей и выбрать пользователей с самым высоким рейтингом в качестве соседей для пользователя. Недостатком этого является то, что по мере увеличения числа пользователей этот процесс может занять очень много времени. Всего 1000 пользователей требуют 1000C2 (0,5 *1000* 999 = = 499 500) вызовов функции совместимости, что также может быть очень тяжелым для сервера.

Поэтому я ищу любые советы, ссылки на статьи и т. Д. О том, как лучше всего создать такую ​​систему.

Ответы [ 7 ]

6 голосов
/ 30 сентября 2008

В кн. Программирование Коллективного разума
http://oreilly.com/catalog/9780596529321

Глава 2 «Создание рекомендаций» действительно хорошо описывает методы рекомендации предметов людям на основе сходства между пользователями. Вы можете использовать алгоритмы подобия, чтобы найти «соседей», которых вы ищете. Эта глава доступна в Поиске книг Google здесь:
http://books.google.com/books?id=fEsZ3Ey-Hq4C&printsec=frontcover

1 голос
/ 02 октября 2008

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

Одной из хороших возможностей здесь является использование спектральной кластеризации , которая нуждается именно в том, что у вас есть: матрице подобия. Недостатком является то, что вам все еще нужно вычислить функцию совместимости для каждой пары точек, т.е. е. алгоритм O (n ^ 2).

Если вам абсолютно необходим алгоритм быстрее, чем O (n ^ 2), то вы можете попробовать подход, называемый пространствами различий . Идея очень проста. Вы инвертируете свою функцию совместимости (например, взяв ее в обратную сторону), чтобы превратить ее в меру отличия или расстояния. Затем вы сравниваете каждый элемент (в вашем случае пользователь) с набором элементов-прототипов и рассматриваете полученные расстояния как координаты в пространстве. Например, если у вас есть 100 прототипов, то каждый пользователь будет представлен вектором из 100 элементов, т.е. е. точкой в ​​100-мерном пространстве. Тогда вы можете использовать любой стандартный алгоритм кластеризации, такой как K-means .

Вопрос теперь в том, как вы выбираете прототипы и сколько вам нужно. Были испробованы различные эвристики, однако здесь есть диссертация , в которой утверждается, что случайного выбора прототипов может быть достаточно. Это показывает эксперименты, в которых использование 100 или 200 случайно выбранных прототипов дало хорошие результаты. В вашем случае, если у вас есть 1000 пользователей, и вы выбираете 200 из них в качестве прототипов, то вам нужно будет оценить вашу функцию совместимости 200 000 раз, что является улучшением в 2,5 раза по сравнению со сравнением каждой пары. Однако реальным преимуществом является то, что для 1 000 000 пользователей 200 прототипов все еще будет достаточно, и вам нужно будет выполнить 200 000 000 сравнений, а не 500 000 000 000 улучшений с коэффициентом 2500. В результате получается алгоритм O (n), лучше, чем O (n ^ 2), несмотря на потенциально большой постоянный коэффициент.

1 голос
/ 01 октября 2008

Обязательно посмотрите Совместная фильтрация . Многие системы рекомендаций используют совместную фильтрацию для предложения элементов пользователям. Они делают это, находя «соседей» и затем предлагая предметы, которые ваши соседи высоко оценили, но вы не оценили. Вы могли бы пойти так далеко, чтобы найти соседей, и кто знает, может быть, вам понадобятся рекомендации в будущем.

GroupLens - исследовательская лаборатория Университета Миннесоты, которая изучает методы совместной фильтрации. У них есть тонна опубликованных исследований, а также несколько образцов данных.

Netflix Prize - это конкурс для определения, кто может наиболее эффективно решить эту проблему. Перейдите по ссылкам с их LeaderBoard . Несколько конкурентов делятся своими решениями.

Что касается недорогого решения, вы можете попробовать это:

  • Создание категорий для ваших предметов. Если мы говорим о музыке, это может быть классика, рок, джаз, хип-хоп ... или идти дальше: Grindcore, Math Rock, Riot Grrrl ...
  • Теперь каждый раз, когда пользователь оценивает предмет, сверните его оценки на уровне категории. Итак, вы знаете, что «Пользователь A» любит Honky Tonk и Acid House, потому что они часто дают этим предметам высокие оценки. Частота и сила, вероятно, важны для совокупной оценки вашей категории.
  • Когда пришло время найти соседей, вместо просмотра всех рейтингов, просто ищите похожие оценки в категориях.

Этот метод не будет таким точным, но он быстрый.

Приветствие.

0 голосов
/ 30 сентября 2008

Проблемы с производительностью могут быть значительно смягчены, если вы считаете это проблемой сборки / пакетной обработки, а не запросом в реальном времени.

График может быть вычислен статически, а затем скрытно обновлен, например, ежечасно, ежедневно и т. д., чтобы затем генерировать ребра и хранилище, оптимизированное для запроса времени выполнения, например, Топ 10 похожих пользователей для каждого пользователя.

+ 1 для программирования Коллективного разума тоже - это очень информативно - хотелось бы (или я был!) Не как Python-ориентированный, но все же хорошо.

0 голосов
/ 30 сентября 2008

Похоже, вам нужно прочитать о алгоритмах кластеризации . Общая идея заключается в том, что вместо того, чтобы сравнивать каждую точку с каждой другой точкой, каждый раз, когда вы делите их на группы похожих точек. Тогда окрестностью могут быть все точки в одном кластере. Количество / размер кластеров обычно является параметром алгоритма кластеризации.

Йо может найти видео о кластеризации в серии Google о кластерных вычислениях и mapreduce .

0 голосов
/ 30 сентября 2008

Вы слышали о сетях Кохонена ?

Это самоорганизующийся алгоритм обучения, который группирует подобные переменные в одинаковые слоты. Хотя большинство сайтов, подобных тому, на котором я ссылаюсь, отображает сеть как двумерную, расширение алгоритма в многомерный гиперкуб практически не задействовано.

При такой структуре данных поиск и сохранение соседей с похожими вкусами становится тривиальным, поскольку аналогичные пользователи должны хранить их в одинаковых местах (почти как обратный хэш-код).

Это сводит вашу проблему к поиску переменных, которые будут определять сходство, и установлению расстояний между возможными перечисляемыми значениями, как, например, классические и акустические, близки друг к другу, в то время как дэт-метал и регги довольно далеко (по крайней мере, по моему мнению)

Кстати, для нахождения хороших делительных переменных лучшим алгоритмом является дерево решений . Узлы, расположенные ближе к корню, будут наиболее важными переменными для установления «близости».

0 голосов
/ 30 сентября 2008

Проблема, похоже, заключается в «проблемах классификации». Да, есть так много решений и подходов.

Чтобы начать исследование, проверьте это: http://en.wikipedia.org/wiki/Statistical_classification

...