Búsqueda de sitios web

Predicción de enlaces: predice bordes en una red usando Networkx


La predicción de enlaces es una idea clave en el campo del análisis de redes. Implica prever el potencial de establecimiento de un vínculo entre los nodos de la red. Una potente herramienta para el análisis de redes, incluidas las tareas de predicción de enlaces, es el módulo NetworkX para Python. Este completo tutorial le guiará en el uso de NetworkX para anticipar enlaces, repleto de ejemplos concisos y comprensibles.

Introducción a la predicción de enlaces

Los nodos en una red o gráfico representan entidades, mientras que los bordes o vínculos entre estos nodos reflejan sus relaciones. La predicción de enlaces utiliza la topología actual de la red para pronosticar enlaces potenciales entre nodos. La predicción de enlaces tiene diversos usos, como la predicción de relaciones sociales en redes sociales y la colaboración de investigadores en redes de coautoría.

Primeros pasos con NetworkX

Asegúrese de que la biblioteca NetworkX esté instalada antes de continuar con la predicción de enlaces. Si no, use pip para instalarlo:

pip install networkx

También necesitamos instalar las bibliotecas numpy y pandas para poder realizar la predicción de enlaces:

pip install numpy pandas

Conceptos básicos de la creación de redes en NetworkX

Comencemos estableciendo una red fundamental en NetworkX:

import networkx as nx

# Create an empty graph
G = nx.Graph()

# Add nodes
G.add_node(1)
G.add_node(2)
G.add_node(3)

# Add edges
G.add_edge(1, 2)
G.add_edge(1, 3)

# Draw the graph
nx.draw(G, with_labels=True)

Sólo hay tres nodos y dos aristas en esta sencilla red.

Predicción de enlaces en NetworkX

Para realizar predicciones de enlaces, NetworkX ofrece varias funciones. Se basan en diversos métodos y teorías.

Ejemplo 1: vecinos comunes

El uso de vecinos comunes es un método simple de predicción de enlaces. Implica que si dos nodos tienen muchos vecinos compartidos, es más probable que creen un vínculo.

# Create a graph
G = nx.complete_graph(5)
G.remove_edge(1, 3)

# Perform link prediction
preds = nx.common_neighbors(G, 1, 3)
print(len(list(preds)))  # Output: 3

Aquí, agregamos cinco nodos y eliminamos un borde para construir un gráfico completo (una red en la que cada par de nodos está conectado por un borde directo). En función de la cantidad de vecinos compartidos, pronosticamos este eslabón perdido.

Ejemplo 2: coeficiente de Jaccard

El número de vecinos compartidos se divide por el número total de vecinos para calcular el coeficiente de Jaccard, que evalúa la probabilidad de una arista.

# Create a graph
G = nx.complete_graph(5)
G.remove_edge(1, 3)

# Perform link prediction
preds = nx.jaccard_coefficient(G, [(1, 3)])
for u, v, p in preds:
   print(f'({u}, {v}) -> {p}')  # Output: (1, 3) -> 0.6

En esta ilustración, se calcula el coeficiente Jaccard del borde eliminado.

Ejemplo 3: Apego preferencial

Según la teoría del vínculo preferencial, los nodos con un alto grado (más conexiones) tienen más probabilidades de conectarse en el futuro.

# Create a graph
G = nx.complete_graph(5)
G.remove_edge(1, 3)

# Perform link prediction
preds = nx.preferential_attachment(G, [(1, 3)])
for u, v, p in preds:
   print(f'({u}, {v}) -> {p}')  # Output: (1, 3) -> 12

En este ejemplo se calcula la puntuación de unión preferencial para el borde eliminado.

Ejemplo 4: Índice Adámico/Adar

Al igual que los vecinos comunes, el índice Adamic/Adar pone menos énfasis en los nodos con un alto grado.

# Create a graph
G = nx.complete_graph(5)
G.remove_edge(1, 3)

# Perform link prediction
preds = nx.adamic_adar_index(G, [(1, 3)])
for u, v, p in preds:
   print(f'({u}, {v}) -> {p}')  # Output: (1, 3) -> 1.8204784532536746

En este caso, se calcula un valor decimal conocido como índice Adamic/Adar, que mide el borde eliminado.

Ejemplo 5: Índice de asignación de recursos

Otra métrica que crea una puntuación basada en los vecinos compartidos de dos nodos es el índice de asignación de recursos.

# Create a graph
G = nx.complete_graph(5)
G.remove_edge(1, 3)

# Perform link prediction
preds = nx.resource_allocation_index(G, [(1, 3)])
for u, v, p in preds:
   print(f'({u}, {v}) -> {p}')  # Output: (1, 3) -> 0.6666666666666666

Aquí se calcula el índice de asignación de recursos del borde eliminado.

Conclusión

La predicción de enlaces es un tema interesante con muchos usos en el mundo real. El paquete NetworkX en Python proporciona una serie de técnicas de predicción de enlaces, cada una con ventajas y desventajas. Como siempre, es esencial comprender las ideas y técnicas subyacentes, probar muchos enfoques y seleccionar el que funcione mejor para su caso de uso específico.

En esta guía, hemos adoptado un enfoque práctico para comprender la predicción de enlaces en NetworkX. Se han discutido las ideas fundamentales y se han ilustrado una variedad de técnicas de predicción de enlaces con ejemplos simples. Pero esto es sólo la punta del iceberg. Las posibilidades para la investigación de redes y la predicción de conexiones se abren a medida que profundiza en NetworkX.