← 🤖 ML a Escala
avanzado

5.3 · Minería de grafos a escala

⏱ 25 minMódulo 5: Analítica y ML a Escala

¿Por qué minería de grafos?

Muchos de los datasets más grandes del mundo no son tablas, son grafos: la web (páginas y enlaces), las redes sociales (personas y relaciones), las redes de citas científicas, las transacciones financieras o las redes de transporte. Analizar su estructura responde preguntas como: ¿qué páginas son más importantes?, ¿quiénes son los usuarios más influyentes?, ¿qué grupos de cuentas podrían ser fraude coordinado?

El reto es la escala: el grafo de la web tiene miles de millones de nodos. Un algoritmo de grafos clásico en una sola máquina no es viable; hacen falta procesamiento distribuido y algoritmos diseñados para iterar sobre vecindades sin recorrer el grafo entero.

Representación de grafos

Las formas habituales de representar un grafo G = (V, E):

RepresentaciónEstructuraAdecuada para
Lista de aristasPares (origen, destino)Entrada/salida, datos dispersos, pipelines distribuidos
Listas de adyacenciaCada nodo → lista de vecinosRecorridos, algoritmos iterativos
Matriz de adyacenciaMatriz n×n con 1 si hay aristaGrafos densos y pequeños (crece como )

En sistemas distribuidos (GraphX, GraphFrames) el grafo se almacena como dos colecciones: un DataFrame/RDD de vértices (id, atributos) y otro de aristas (origen, destino, atributos), particionados por el clúster.

Los grafos reales suelen ser dispersos: cada nodo se conecta con una fracción ínfima del total. Por eso la matriz de adyacencia completa casi nunca se usa a gran escala.

PageRank: medir la importancia

PageRank (el algoritmo original de Google) asigna a cada página una puntuación de importancia basada en los enlaces que recibe: un enlace desde una página importante vale más que uno desde una página marginal.

La idea es el navegante aleatorio: con probabilidad d (el damping factor, típicamente 0.85) sigue un enlace al azar de la página actual; con probabilidad 1 − d “se teletransporta” a cualquier página del grafo. El PageRank de cada nodo es la fracción de tiempo que el navegante pasa en él a largo plazo.

La fórmula iterativa para el nodo v:

PR(v) = (1 - d) / N  +  d · Σ  PR(u) / outDegree(u)
                           u → v
  • N: número total de nodos.
  • La suma recorre todos los nodos u que enlazan a v.
  • Cada u reparte su PageRank a partes iguales entre sus enlaces salientes.

El proceso: se inicializa PR(v) = 1/N para todos, se aplica la fórmula repetidamente y los valores convergen tras unas pocas decenas de iteraciones.

graph TD
A["Página A<br/>PR inicial 1/4"] -->|"reparte PR/2"| B["Página B"]
A -->|"reparte PR/2"| C["Página C"]
B -->|"reparte todo su PR"| C
C -->|"reparte todo su PR"| A
D["Página D<br/>(sin salidas)"] -.->|"teletransportacion 1-d"| A
C -->|"PR alto: recibe de A y B"| CC["C converge como la mas importante"]
Grafo pequeño con flujo de PageRank: cada nodo reparte su puntuación entre sus enlaces salientes; los nodos colgantes (D) se tratan con la teletransportación.

Dos detalles prácticos:

  • Nodos colgantes (sin enlaces salientes, como D): no reparten nada y “fugarían” masa de PageRank. Se soluciona redistribuyendo su puntuación entre todos los nodos (equivalente a la teletransportación).
  • Damping factor d: controla el equilibrio entre seguir la estructura del grafo (d alto) y explorar al azar (d bajo). El valor 0.85 es el estándar histórico.

Detección de comunidades

Una comunidad es un grupo de nodos densamente conectados entre sí y poco conectados con el resto: grupos de amigos, áreas temáticas de la web, células de fraude.

Algoritmos clásicos a escala:

  • Label Propagation: cada nodo adopta la etiqueta mayoritaria de sus vecinos, iterativamente, hasta estabilizarse. Muy barato y paralelizable; resultado aproximado.
  • Louvain: optimiza la modularidad (mide cuánto más densas son las conexiones internas de las comunidades frente a un grafo aleatorio). Más preciso, más costoso.
  • Componentes conexas: el caso más simple; agrupa nodos alcanzables entre sí.

GraphX y GraphFrames

HerramientaPlataformaCaracterísticas
GraphXSpark (Scala, RDD)API Graph[V, E], algoritmos incluidos: PageRank, componentes conexas, conteo de triángulos
GraphFramesSpark (DataFrames, Scala/Python)Basado en DataFrames → optimización Catalyst; PageRank, label propagation, BFS, motif finding
Neo4j / TigerGraphBases de datos de grafosConsultas declarativas (Cypher/GQL) cuando el grafo cabe en un servicio dedicado

Ambos siguen el modelo Pregel (“piensa como un vértice”): en cada superpaso, cada vértice recibe mensajes de sus vecinos, actualiza su estado y envía mensajes nuevos. Este patrón hace que algoritmos como PageRank se ejecuten de forma natural en paralelo, con cada nodo del clúster encargado de un subconjunto de vértices.

Aplicaciones

  • Búsqueda web: PageRank y sus variantes (personalizado, temático) para ordenar resultados.
  • Redes sociales: detección de influencers (centralidad), sugerencia de amigos (conteo de triángulos, vecinos comunes), comunidades.
  • Detección de fraude: anillos de cuentas que se transfieren dinero entre sí forman comunidades sospechosamente densas.
  • Biología: redes de interacción de proteínas para identificar genes esenciales.

Ejercicio: PageRank iterativo

🧪 Ejercicio

PageRank sobre un grafo pequeño

Implementa PageRank iterativo con listas de adyacencia en Python puro. El grafo es: A enlaza a B y C; B enlaza a C; C enlaza a A; D enlaza a C. Usa damping factor d = 0.85, inicializa todos los PageRank a 1/N y ejecuta 20 iteraciones aplicando la fórmula PR(v) = (1-d)/N + d * suma(PR(u)/outDegree(u)). En este grafo no hay nodos colgantes, así que no hace falta redistribuir su masa. Imprime el PageRank final de cada nodo y comprueba que C es el más importante.

Comprueba lo aprendido

Comprueba que lo pillaste

En PageRank con d = 0.85, ¿qué significa el damping factor?

Comprueba que lo pillaste

Un nodo recibe un enlace desde una página con PageRank alto que enlaza a 100 páginas, y otro enlace desde una página con PageRank bajo que solo enlaza a 2. ¿Qué enlace aporta más PageRank?

Comprueba que lo pillaste

¿Qué modelo de computación siguen GraphX y GraphFrames para ejecutar algoritmos de grafos en paralelo?

Resumen

  • Los grafos a escala se representan distribuidos como colecciones de vértices y aristas (listas de adyacencia o de aristas, nunca matrices densas).
  • PageRank mide la importancia por los enlaces recibidos, repartiendo el peso entre enlaces salientes y usando el damping factor (0.85) con teletransportación para garantizar convergencia.
  • Los nodos colgantes requieren redistribuir su masa para no perder PageRank.
  • La detección de comunidades (label propagation, Louvain) encuentra grupos densamente conectados: amigos, temas, fraude.
  • GraphX y GraphFrames ejecutan estos algoritmos en Spark siguiendo el modelo Pregel de paso de mensajes entre vértices.
  • Aplicaciones: buscadores web, redes sociales, detección de fraude y biología computacional.

📚 Lecturas y fuentes

RecursoTipoPor qué leerlo
PageRank (Wikipedia en español)DocsLa explicación más accesible del navegante aleatorio; lee “Descripción” y “Fórmula” y para ahí.
GraphX Programming GuideDocsReferencia oficial; ve directo a “Pregel API” y a “PageRank” dentro de “Graph Algorithms”, ignora el resto. (en inglés)
Stanford Large Network Dataset Collection (SNAP)DatasetGrafos reales para practicar; empieza con ego-Facebook o web-Google, que son manejables sin clúster. (en inglés)
The Anatomy of a Large-Scale Hypertextual Web Search Engine (Brin y Page, 1998)PaperEl artículo original de Google; lee solo la sección 2.1 “PageRank: Bringing Order to the Web”, son dos páginas. (en inglés)