Each node starts with a random 2D embedding vector. A GCN-style mean-aggregation rule repeatedly mixes every node's embedding with the average of its train-graph neighbors:
e_i ← (1-α)·e_i + α · mean_{j ∈ N(i)} e_j
e_i ← e_i / ‖e_i‖ (renormalized to a fixed radius)
This is the same neighbor-averaging step at the heart of GCN, GraphSAGE and label propagation — after enough steps, embeddings of nodes that share many neighbors converge, even if they were never directly connected.
A held-out fraction of real edges is hidden from the aggregation step entirely (a realistic train/test split). Link prediction then scores every non-train pair with:
cosine(i,j) = (e_i · e_j) / (‖e_i‖ ‖e_j‖)
dot(i,j) = e_i · e_j
A pair scores above the threshold → predicted link. AUC estimates P(score(held-out link) > score(random non-link)) over all test pairs — 50% is random guessing, 100% is a perfect ranking.
Because every embedding is renormalized to the same fixed radius each round, cosine and dot product rank pairs identically here (dot = radius² · cosine, a monotonic rescaling) — a good illustration of why L2-normalized embeddings make the two scoring rules equivalent in practice.
- α slider — how strongly each step pulls a node toward its neighbors' average; α=0 freezes embeddings, high α converges fast but can overshoot.
- Step / Auto — apply one aggregation round, or run continuously.
- Threshold — the score cutoff for "predicted link"; raising it trades recall for precision.
- Held-out % — how many real edges are hidden from the model before it aggregates, then used only to grade its predictions.
- Drag to pan, scroll to zoom the embedding plane.