user@devops:~$ cat README.md
GraphSAGE + GAT -- link prediction desde cero
# Descripción
GraphSAGE (Hamilton 2017) y GAT (Velickovic 2018) implementados desde cero en PyTorch, sin PyTorch Geometric. Parte 1: SBM 4x80 nodos, p_in=0.10, p_out=0.012, 1.732 aristas (71.9% intra), features 16d (8 senal de comunidad + 8 ruido), seed 42. Parte 2: split de aristas 70/10/20 (train 1.213 / val 173 / test 346) y muestreo negativo 1:1; el modelo solo ve el grafo residual (grado medio 7.58). Parte 3: heuristicos topologicos sobre A_train -- Common Neighbors AUC 0.5267, Adamic-Adar 0.5273, Preferential Attachment 0.5100. Parte 4: MLP de features 1.600 params (sin grafo) AUC 0.7251; GraphSAGE mean 2 capas 3.200 params, early-stop epoca 18, test AUC 0.7407 / AP 0.7196 / Hits@10 0.399. Parte 5: GAT 4 heads x 8d + 1 head x 32d, 1.664 params, atencion densa enmascarada, early-stop epoca 14, test AUC 0.7213. Parte 6: Hits@K con 80 negativos por positivo. Hallazgo: al ocultar el 30% de aristas los vecinos comunes desaparecen y CN/AA colapsan; la senal de comunidad en X ya da 0.725 al MLP y el message passing de SAGE suma +1.6 pp (+21 pp vs Adamic-Adar). GAT no supera a SAGE en este grafo pequeno y homofilo. CPU 21.2s. 7 visualizaciones.
# Características principales
$ SBM 4 comunidades x 80 nodos, 1.732 aristas, 71.9% intra-bloque, features 16d
$ Holdout de aristas 70/10/20: el encoder solo ve el grafo residual (grado 7.58)
$ Heuristicos: Common Neighbors 0.527, Adamic-Adar 0.527, Pref. Attachment 0.510
$ MLP de features (sin grafo) 1.600 params, AUC 0.725 -- la comunidad vive en X
$ GraphSAGE mean aggregator 3.200 params, AUC 0.741 / AP 0.720 / Hits@10 0.399
$ GAT multi-head (4x8 -> 1x32) 1.664 params, atencion densa enmascarada, AUC 0.721
$ Hallazgo: con 30% de aristas ocultas CN/AA caen a azar; SAGE +21 pp vs Adamic-Adar
$ 7 visualizaciones: overview, bloques, curvas, ROC/PR, t-SNE, atencion, metricas
# Galería
# Tecnologías utilizadas