02 TRAIN — bigram counts from the walk
- observations
- 0
- cells filled
- 0 / 729
- A↔B divergence
- —
Stage 3 is now an actual embedder. Previously that panel showed a row of the count table, which is a lookup, not an embedding — a sparse 27-vector indexed by identity. It is now: PPMI-weight the accumulated counts, form the Gram matrix S·Sᵀ so similarity is measured over rows, eigendecompose with cyclic Jacobi rotations, take the top 8 components. 37 ms for 27×27, recomputed every 25 steps.
Watch the structure arrive. Early on the scatter is noise, because the agents have seen almost nothing. As coverage grows, vowels pull together and consonants pull together, and the separation figure climbs. Nobody labels a letter as a vowel. The factorisation finds it, because vowels occupy similar positions in the transition structure even when they never occur next to each other — which is precisely what the count table could never tell you.
Reference values on the full corpus: vowel↔vowel 0.352, cons↔cons 0.220, vowel↔cons 0.128, separation +0.224. The agents converge toward this as they cover the container. If you flip the pair to independent they get there faster, because correlated walkers sample less ground.
One correction worth recording. The first version of this embedder symmetrised the PPMI matrix and produced negative separation — vowels scored closer to consonants than to each other. Symmetrising merges what-follows with what-precedes, and since vowels and consonants alternate, it destroys exactly the signal being measured. The Gram matrix fixes it. The test caught it; the diagram would not have.