machine-learning - tag - open graph twitter




comment regrouper les utilisateurs en fonction des balises (2)

Vous voulez essentiellement regrouper les utilisateurs en fonction de leurs tags.

Pour rester simple, supposons que vous avez seulement 10 étiquettes (au lieu de 20 000). Supposons qu'un utilisateur, disons user_34, possède les 2ème et 7ème tags. Pour cette tâche de regroupement, user_34 peut être représenté comme un point dans l' espace à 10 dimensions , et ses coordonnées correspondantes sont: [0,1,0,0,0,0,1,0,0,0].

Dans votre propre cas, chaque utilisateur peut être représenté de manière similaire en tant que point dans un espace de 20 000 dimensions. Vous pouvez utiliser Apache Mahout qui contient de nombreux algorithmes de clustering efficaces, tels que K-means.

Puisque tout est bien défini dans un système de coordonnées mathématiques, il est facile de calculer la distance entre deux utilisateurs! Il peut être calculé en utilisant n'importe quelle fonction de distance, mais la distance euclidienne est la norme de facto.

Remarque: Mahout et de nombreux autres programmes d'extraction de données prennent en charge de nombreux formats adaptés aux fonctions SPARSE, c'est-à-dire que vous n'avez pas besoin d'insérer ..., 0,0,0,0, ... dans le fichier, mais seulement de spécifier les tags sont sélectionnés. (Voir RandomAccessSparseVector dans Mahout. )

Remarque: j'ai supposé que vous souhaitiez uniquement regrouper vos utilisateurs. Extraire des informations représentatives des clusters est quelque peu délicat. Par exemple, pour chaque cluster, vous pouvez sélectionner les tags les plus courants entre les utilisateurs du cluster. Alternativement, vous pouvez utiliser des concepts de la théorie de l' information , tels que le gain d'information pour savoir quelles balises contiennent plus d'informations sur le cluster.

J'aimerais regrouper les utilisateurs en fonction des catégories ou des tags des émissions qu'ils regardent. Quel est le meilleur / le meilleur algorithme pour le faire?

En supposant que j'ai environ 20 000 balises et plusieurs millions d'événements de surveillance que je peux utiliser comme signaux, y a-t-il un algorithme que je peux implémenter en utilisant dit porc / hadoop / mortier ou peut-être sur neo4j?

En termes de données, j'ai des utilisateurs, des programmes qu'ils ont regardés, et les tags d'un programme (généralement environ 10 tags par programme).

Je voudrais attendre à la fin k nombre de grappes (peut-être une douzaine?) Ou des seaux larges que je peux utiliser pour classer et regrouper mes utilisateurs dans des compartiments et également avoir un aperçu de la façon dont ils seraient divisés - avec un ensemble de balises représentant chaque groupe.

J'ai vu quelques messages là-bas suggérant un algorithme hiérarchique, mais je ne sais pas comment on pourrait calculer "distance" dans ce cas. Serait-ce une distance entre deux utilisateurs, ou entre un utilisateur et un ensemble de balises, etc.


Vous devriez envisager d'utiliser neo4j . Vous pouvez modéliser vos données à l'aide des libellés de nœud et des types de relation suivants.

Si vous n'êtes pas familier avec la notation en langage Cypher de neo4j, (:Foo) représente un nœud avec l'étiquette Foo , et [:BAR] représente une relation avec le type BAR . Les flèches autour d'une relation indiquent sa directionnalité. neo4j traverse efficacement les relations dans les deux sens.

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

Vous auriez k nœuds de Cluster nœuds de Tag 20K et plusieurs millions de relations WATCHED .

Avec ce modèle, en commençant par n'importe quel nœud de Cluster , vous pouvez trouver efficacement tous les tags, programmes et utilisateurs associés.