machine learning - cómo agrupar usuarios según las etiquetas
machine-learning neo4j (2)
Básicamente, desea agrupar a los usuarios según sus etiquetas.
Para simplificar, suponga que solo tiene 10 etiquetas (en lugar de 20,000). Supongamos que un usuario, digamos user_34, tiene la segunda y séptima etiqueta. Para esta tarea de agrupamiento, user_34 puede representarse como un punto en el espacio de 10 dimensiones , y sus coordenadas correspondientes son: [0,1,0,0,0,0,1,0,0,0].
En su propio caso, cada usuario puede representarse de manera similar como un punto en un espacio de 20,000 dimensiones. Puede utilizar Apache Mahout que contiene muchos algoritmos efectivos de clustering, como K-means.
Dado que todo está bien definido en un sistema matemático de coordenadas, ¡es fácil calcular la distancia entre dos usuarios! Se puede calcular utilizando cualquier función de distancia, pero la distancia euclidiana es el estándar de facto.
Nota: Mahout y muchos otros programas de minería de datos admiten muchos formatos adecuados para las características de SPARSE, es decir, no es necesario insertar ..., 0,0,0,0, ... en el archivo, sino solo especificar qué etiquetas son seleccionadas (Consulte RandomAccessSparseVector en Mahout ) .
Nota: asumí que solo desea agrupar a sus usuarios. Extraer información representativa de los clusters es un tanto complicado. Por ejemplo, para cada grupo puede seleccionar las etiquetas que son más comunes entre los usuarios del clúster. De forma alternativa, puede usar conceptos de la teoría de la información , como la ganancia de información, para descubrir qué etiquetas contienen más información sobre el clúster.
Me gustaría agrupar a los usuarios según las categorías o etiquetas de los programas que miran. ¿Cuál es el algoritmo más fácil / mejor para hacer esto?
Asumiendo que tengo alrededor de 20,000 etiquetas y varios millones de eventos de observación que puedo usar como señales, ¿hay algún algoritmo que pueda implementar usando say pig / hadoop / mortar o tal vez en neo4j?
En términos de datos, tengo usuarios, programas que han visto y las etiquetas que tiene un programa (por lo general, alrededor de 10 etiquetas por programa).
Me gustaría esperar al final k cantidad de clusters (¿quizás una docena?) O grupos amplios que puedo usar para clasificar y agrupar a mis usuarios en cubos y también obtener información sobre cómo se dividirían: con un conjunto de etiquetas representando cada grupo.
He visto algunas publicaciones que sugieren un algoritmo jerárquico, pero no estoy seguro de cómo se calcularía la "distancia" en ese caso. ¿Sería eso una distancia entre dos usuarios, o entre un usuario y un conjunto de etiquetas, etc.
Deberías considerar usar neo4j
. Puede modelar sus datos usando las siguientes etiquetas de nodo y tipos de relación.
Si no está familiarizado con la notación del lenguaje Cypher de neo4j, (:Foo)
representa un nodo con la etiqueta Foo
, y [:BAR]
representa una relación con el tipo BAR
. Las flechas alrededor de una relación indican su direccionalidad. neo4j atraviesa de manera eficiente las relaciones en ambas direcciones.
(:Cluster) -[:INCLUDES_TAG]-> (:Tag) <-[:HAS_TAG]- (:Program) <-[:WATCHED]- (:User)
Tendría k
nodos de Cluster
, nodos de Tag
20K y varios millones de relaciones de WATCHED
.
Con este modelo, comenzando con cualquier nodo de Cluster
dado, puede encontrar eficientemente todas sus etiquetas, programas y usuarios relacionados.