как кластеризировать пользователей на основе тегов


Я хотел бы кластеризировать пользователей на основе категорий или тегов шоу, которые они смотрят. Какой самый простой/лучший алгоритм для этого?

Предполагая, что у меня есть около 20 000 тегов и несколько миллионов событий просмотра, которые я могу использовать в качестве сигналов, есть ли алгоритм, который я могу реализовать, используя, скажем, pig / hadoop / mortar или, возможно, на neo4j?

С точки зрения данных у меня есть пользователи, программы, которые они смотрели, и теги, которые есть у программы (обычно около 10 тегов на программу).

Я хотел бы ожидать на конечное k число кластеров (может быть, дюжина?) или широкие корзины, которые я могу использовать для классификации и группирования моих пользователей в корзины, а также получить некоторое представление о том, как они будут разделены - с набором тегов, представляющих каждый кластер.

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

2 2

2 ответа:

Вы в основном хотитекластер пользователей в соответствии с их тегами.

Чтобы упростить задачу, предположим, что у вас есть только 10 тегов (вместо 20 000). Предположим, что пользователь, скажем user_34, имеет 2-й и 7-й тег. Для решения этой задачи кластеризации, user_34 может быть представлено в виде пункт в 10-мерном пространстве, и его соответствующие координаты: [0,1,0,0,0,0,1,0,0,0].

В вашем случае каждый пользователь может быть аналогично представлен в виде точки в 20 000-мерное пространство. Вы можете использовать Apache Mahout, который содержит множество эффективных алгоритмов кластеризации, таких как K-means.

Поскольку все хорошо определено в математической системе координат, вычислить расстояние между любыми двумя пользователями очень просто! Он может быть вычислен с помощью любой функции расстояния, но евклидово расстояние является стандартом де-факто.

Примечание: Mahout и многие другие программы интеллектуального анализа данных поддерживают множество форматов, подходящих для разреженных функций, т. е. Вам не нужно вставлять ...,0,0,0,0,... в файле, но только нужно указать, какие теги выбраны. (См. RandomAccessSparseVector в Mahout.)

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

Вы должны рассмотреть возможность использования neo4j. Вы можете моделировать свои данные с помощью следующих меток узлов и типов отношений.

Если вы не знакомы с обозначением языка шифрования neo4j, (:Foo) представляет узел с меткой Foo, а [:BAR] представляет связь с типом BAR. Стрелки вокруг отношения указывают на его направленность. neo4j эффективно пересекает отношения в обоих направлениях.

(:Cluster) -[:INCLUDES_TAG]-> (:Tag) <-[:HAS_TAG]- (:Program) <-[:WATCHED]- (:User)

Ты бы так и сделал.k Cluster узлы, 20K Tag узлы и несколько миллионов WATCHED связей.

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