The Vektorgeist Method · Study note
Everything the method rests on, built from adding, multiplying, dividing, and two buttons on a calculator. No algebra. No symbols standing in for numbers. Every figure on this page was printed by a script before it was written here — redo any of them and they will match.
The whole thing, in order
Two people say the same word. Two people write the same letter. A sonar pings twice. In every case there are two things that happen over time, and the question is always the same:
How far apart are they?
Answer that well and you can recognise a word, tell two handwritings apart, or spot when a machine's sound has changed. The whole method is one measuring stick, built in six moves. Everything else in the papers is a variation on those six moves.
You need three things you already have: multiplying, dividing, and the square-root button. Later, one more button called arccos. That is the entire toolkit.
Take one instant of sound — say ten thousandths of a second. Split it into buckets: how much low sound, how much middle, how much high. Suppose the meter reads:
low 50 middle 30 high 20 total = 100
Now divide each one by the total:
50 / 100 = 0.5 30 / 100 = 0.3 20 / 100 = 0.2 the list is: 0.5 0.3 0.2 and it adds to 1
That's it. That is the first move, and it is just division. Two rules hold no matter what: nothing is negative, and everything adds to exactly 1.
Dividing by the total throws away how loud it was and keeps only the shape. A shout and a whisper of the same vowel both become 0.5 0.3 0.2. That is not a convenience — it's the whole point of view. The method only ever cares about proportions, never about absolute size.
The buckets don't have to be sound. They can be colours in a light reading, distances in a sonar echo, or directions a pen moved. The arithmetic doesn't know the difference.
The name in the papers
A list like this is called a probability distribution, and one instant's worth is called a frame. When you see the word "distribution", read: a list of fractions that adds to 1.
One more name. If you have 3 buckets, all the possible lists together form a flat triangle sitting in space, with corners at "all low", "all middle", "all high". The papers call that triangle the simplex. It's just the word for "every list that could possibly come out of Move 1".
Take the square root of each number in the list. That's one button, three times:
√0.5 = 0.707107 √0.3 = 0.547723 √0.2 = 0.447214
Now square them again and add them up:
0.707107 × 0.707107 = 0.5
0.547723 × 0.547723 = 0.3
0.447214 × 0.447214 = 0.2
───
1.0
Of course it adds to 1 — squaring undoes the square root, so you're just adding the original numbers back up, and those always added to 1.
There is a rule from school, Pythagoras, that says: to find how far a point is from the centre, square each of its coordinates, add them, and take the square root of the total.
We just did that. The total was 1. The square root of 1 is 1.
So every square-rooted list is exactly 1 unit away from the centre — always, with no exceptions, for every list that could ever come out of Move 1. Points all sitting exactly 1 unit from a centre are, by definition, the surface of a ball.
Nothing clever happened. Taking the square root didn't put the data on a ball; it revealed that every possible sound-moment was already living on one. The flat triangle from Move 1 became a curved patch on a globe.
And that matters because a globe is a shape we know how to measure on.
Two cities on Earth. You don't measure the distance by drilling straight through the planet — you measure the curved path across the surface. And that curved path is an angle: London to New York is about 51 degrees of the way around.
So: our two sound-moments are two points on a ball. The distance between them is the angle between them. Here's how to get it, with arithmetic.
Two moments:
first list: 0.5 0.3 0.2 second list: 0.4 0.4 0.2
Step one. Multiply them together, bucket by bucket, and square-root each answer:
0.5 × 0.4 = 0.20 √0.20 = 0.447214 0.3 × 0.4 = 0.12 √0.12 = 0.346410 0.2 × 0.2 = 0.04 √0.04 = 0.200000
Step two. Add those three up:
0.447214 + 0.346410 + 0.200000 = 0.993624
Call that the closeness number. It runs from 0 to 1:
Step three. Turn that closeness into an angle. There's a button for this: arccos.
arccos(0.993624) = 6.4737 degrees
cos takes an angle and gives you back a number between 0 and 1. arccos goes the other way: give it the number, it gives you back the angle. That is the entire relationship — the same way the square-root button undoes squaring.
You do not need to know how it works inside, any more than you need to know how the square-root button works inside. It's a lookup.
Step four. Double it. (Purely a convention — everyone in the field scales it this way, and it changes nothing about which things are closer than which.) In radians rather than degrees, which is what the code uses:
angle = 0.112987 doubled = 0.225974 ← the distance
Sanity check. Compare a list with itself: the closeness number comes out to exactly 1, and arccos(1) = 0. A thing is zero distance from itself. Good — the measuring stick isn't broken.
The names in the papers
The closeness number is the Bhattacharyya coefficient. Terrifying word, and it is multiply the pairs, square-root them, add them up. The final doubled angle is the Fisher–Rao distance. It is not something anyone invented for this project — it's the standard, correct notion of distance between two distributions, settled by a statistician named Rao in 1945. There is no tuning knob and nothing to fit.
Fair question. Why go through a ball and an angle when you could just subtract the two lists and see how big the gaps are?
Because subtraction says a gap of 0.1 is a gap of 0.1 no matter where it happens. That is wrong, and here is the proof in two lines of arithmetic:
| Two lists | Gap if you just subtract | Distance by angle |
|---|---|---|
0.5 0.5 vs 0.4 0.6 |
0.2000 | 0.2014 |
0.1 0.9 vs 0.02 0.98 |
0.1600 | 0.3597 |
Look at what happened. By plain subtraction the second pair is closer (0.16 beats 0.20). By angle it is nearly twice as far apart.
And the angle is right. Going from 0.5 to 0.4 is a nudge — the bucket is still half full. Going from 0.10 down to 0.02 means that bucket almost went silent. Five-sixths of what was there is gone. That is an enormous change, and subtraction can't see it because the numbers involved are small.
Plain subtraction is blind near zero. The angle isn't. That is the entire reason the ball is worth the trouble.
The angle is the exact, correct answer, but arccos is slow when you need to do it millions of times. So there are alternatives. All of them are plain arithmetic, all give the same ordering of near and far. On the two lists from Move 3:
| Stick | Value | What it's for |
|---|---|---|
| Fisher–Rao (the angle) | 0.225974 | The exact answer. Fair everywhere. |
| chi-squared | 0.012698 | The fast one the code actually runs. No angle button needed. |
| root chi-squared | 0.112687 | Fast and honest — see below. |
| Hellinger | 0.079851 | Rises and falls with the angle. Cheap. |
| Wasserstein-1 | 0.100000 | The only one that cares which bucket is next to which. |
Take the exact distance, square it, take a quarter of it:
0.225974 × 0.225974 = 0.051064 0.051064 ÷ 4 = 0.012766 the fast chi-squared said: 0.012698
They agree to 99.47%. On real audio the measured agreement is 98.7%. That is your licence to run the cheap one in the software while claiming the exact geometry in the theory — they are the same thing to within rounding.
A fair measuring stick has to obey four common-sense rules:
Rule 4 is the one that catches people out. Here are three ordinary lists, and here is chi-squared failing it:
A = 0.7 0.2 0.1 B = 0.3 0.4 0.3 C = 0.1 0.2 0.7
Fisher–Rao A→B 0.834014 B→C 0.834014 detour 1.668027
direct 1.507434 detour is longer ✓
chi-squared A→B 0.163333 B→C 0.163333 detour 0.326667
direct 0.450000 detour is SHORTER ✗
root chi-sq A→B 0.404145 B→C 0.404145 detour 0.808290
direct 0.670820 detour is longer ✓
That's not a rigged example — those are three perfectly ordinary lists. Chi-squared genuinely is not a fair stick. Which is exactly why "root chi-squared" exists: take the square root of it and rule 4 comes back.
If anyone ever asks "is your distance a proper metric?", the honest answer is: Fisher–Rao and root chi-squared are; plain chi-squared isn't, it's a divergence — and we say so. Volunteering that is what makes the rest believable.
The names in the papers
A stick obeying all four rules is a metric. One that obeys the first three but breaks rule 4 is a divergence. The frame-to-frame stick, whichever one you pick, is called the ground metric — "ground" because everything else is built on top of it.
One instant of sound is one point on the ball. But a word isn't an instant. Chop a spoken word into two hundred instants and you get two hundred points, in order — a line traced across the surface of the ball.
A spoken word is a curve. A handwritten letter is a curve. A sonar echo is a curve. A machine's sound over an hour is a curve.
This is the central move of the whole programme. Nearly every other system takes those two hundred points and averages them into one, then compares averages. That throws the time away. We keep the whole curve and compare curves.
Move 10 shows exactly how much that averaging costs, in numbers.
Here's the problem. You say "seven" in four tenths of a second, someone else says it in six tenths. Comparing instant 1 to instant 1, instant 2 to instant 2 is nonsense — you're not at the same place in the word at the same moment.
The fix is from 1978 and it is not ours: let one instant match several instants of the other, so a slow speaker's drawl gets absorbed. Two rules only:
Then, of all the legal ways to line them up, take the cheapest.
Two buckets only, and someone drawls the first sound:
you: 1 0 1 0 0 1 (three instants — you held the first sound) me: 1 0 0 1 (two instants — I said it quickly)
Compare instant-to-instant and you have a problem: your instant 2 (1 0) lands against my instant 2 (0 1), which is a completely different sound. That comparison scores 1.5708 — it says these are two different words.
Now allow the stretch. Your first two instants both match my first instant. Your third matches my second.
your instant 1 → my instant 1 cost 0
your instant 2 → my instant 1 cost 0
your instant 3 → my instant 2 cost 0
─────
total 0.0 over 3 steps → 0.0
Exactly zero. Same word. Which it is.
Curve P has 3 instants, curve Q has 4. Both slide from bucket 1 to bucket 2 — same journey — but Q dawdles at the start.
P: 0.9 0.1 0.5 0.5 0.1 0.9 Q: 0.9 0.1 0.8 0.2 0.5 0.5 0.1 0.9
Step one. Work out the cost of every possible pairing, using Move 3 on each pair. Twelve pairings, twelve angles:
Q1 Q2 Q3 Q4
P1 0.000000 0.283794 0.927295 1.854590
P2 0.927295 0.643501 0.000000 0.927295
P3 1.854590 1.570796 0.927295 0.000000
Step two. Fill in a second grid of running totals. Each cell is its own cost, plus the cheapest of the three cells you could have arrived from (the one to its left, the one above, or the one diagonally up-left). Start at the top-left and work across:
Q1 Q2 Q3 Q4
P1 0.000000 0.283794 1.211089 3.065680
P2 0.927295 0.643501 0.283794 1.211089
P3 2.781886 2.214297 1.211089 0.283794 ← the answer lands here
Step three. Walk backwards from the bottom-right corner, each time stepping to whichever of the three neighbours was cheapest. That traces out the winning line-up:
P1 → Q1 P1 → Q2 P2 → Q3 P3 → Q4 steps taken = 4 total cost = 0.283794 0.283794 ÷ 4 = 0.070949 ← the distance between the two curves
Notice what the stretch did: P1 got matched to both Q1 and Q2. That's Q's dawdle being absorbed.
And compare against not stretching at all — line them up 1-to-1 and cut Q short:
no stretch: 0.523599 with stretch: 0.070949 7.4 times better
The stretch found that these are nearly the same journey. The naive comparison called them wildly different.
The name in the papers
Dynamic Time Warping, usually just DTW. Sakoe and Chiba, 1978. Standard, borrowed, not ours — and we say so.
Slide the two curves against each other until the total mismatch is as small as it can get. Add up the mismatches along that winning line-up. Divide by how many steps it took.
That's the whole distance. The papers call it D.
It has exactly two parts, and keeping them separate is what makes the claim honest:
An earlier version made the alignment minimise the average cost per step, instead of minimising the total and dividing at the end. It looked tidier and it produced a benchmark win.
It was wrong. If you let the alignment minimise the average directly, it learns to pad the path with cheap repeated steps — stalling on an easy match to drag the average down. The apparent win was that padding, and nothing else. It was caught by measuring the padding directly: 0.61 on the version that cheated, 0.00 on the one that doesn't.
The broken version is still in the code, unused, labelled, so the record shows the mistake was made and found.
Once your data lives on the surface of a ball, ordinary averaging goes wrong in a specific way: the average of two points on a globe is buried inside the earth, not on the surface where the data lives.
Two lists, far apart:
first: 0.80 0.15 0.05 second: 0.05 0.15 0.80 plain average: 0.425000 0.150000 0.425000 proper midpoint: 0.403226 0.193548 0.403226
Both of those sit exactly halfway between the two, in the sense of being the same distance from each. So both look like midpoints. Here's the test that separates them — measure the whole arc, then measure it in two hops through each candidate:
the whole arc, first → second: 1.976864 through the proper midpoint: 0.988432 + 0.988432 = 1.976864 exactly the arc through the plain average: 0.994620 + 0.994620 = 1.989240 longer
The proper midpoint's two halves add up to exactly the whole. It's on the path. The plain average sits off to one side, and going through it is a detour — small, but real, and it compounds every time you average.
This is the next move in miniature. Averaging doesn't just lose a little precision. It leaves the geometry entirely.
The names in the papers
Walking along the surface between two points is slerp (spherical linear interpolation — "walk the arc, don't cut through"). The proper centre of a whole set of points is the Karcher mean (or Fréchet mean): the point on the surface whose total squared distance to everything else is smallest. Same idea as an ordinary average, computed on a curved surface instead of a flat one.
Now the payoff. Take two words that are identical almost all the way through and differ only at the very end — "cat" and "cap". Call the fraction of the word where they differ the difference stretch.
Two ways to compare them: keep the curves (Move 8), or average each word down to a single list and compare those. Watch what happens as the difference gets briefer:
| Difference stretch | Curves compared | Averages compared | Ratio |
|---|---|---|---|
| 0.2000 | 0.00833333 | 0.00160256 | 5.2× |
| 0.1000 | 0.00416667 | 0.00040016 | 10.4× |
| 0.0500 | 0.00208333 | 0.00010001 | 20.8× |
| 0.0250 | 0.00104167 | 0.00002500 | 41.7× |
| 0.0125 | 0.00052083 | 0.00000625 | 83.3× |
Read that table down the columns. Every time the difference stretch halves:
So averaging goes blind twice as fast as the signal actually fades. By the time the difference is a hundredth of the word, keeping the curve is 83 times more sensitive than averaging.
Say it like this: "If two sounds differ only in a brief burst at the end, averaging them over time goes blind to that burst four times faster than it should. Comparing the curves stays fair. Averaging can only lose information — and for brief events it loses badly."
This result was originally labelled as ours. It was downgraded on 2026-07-26 after an actual literature check, and the papers say so.
The reason: the "falls to a quarter" half turns out to be classical — it's a standard property of this family of measures that any statistician would recognise, and the condition it needs is the standard condition too. The "halves" half is one line from the definition. Putting two textbook facts together is a thin claim to novelty, and six web searches finding nothing is weak evidence that nothing exists.
The measured effect stands completely untouched. What was withdrawn is only the claim to have discovered the mathematics underneath it. Teach it as: "the effect is real and measured; the maths behind it turned out to be classical, so we downgraded our own claim and printed the downgrade."
The name in the papers
The temporal-pooling theorem. "Pooling" is the jargon for averaging a sequence down to one summary.
A man and a woman say the same vowel. Same vowel — but every frequency in it has moved. The engine as built so far will call them different, and it shouldn't.
The insight is about how frequency works. Going up an octave means doubling the frequency. So if you lay the buckets out on a scale where each step is a multiplication rather than an addition — the way a piano keyboard is laid out — then changing pitch just slides every bucket sideways by the same amount.
Which gives an obvious fix: try every possible slide, and keep the best match.
Look back at Move 3. To get the closeness number you multiply the buckets in pairs, square-root each, and add them all up.
Addition doesn't care what order you add in. 2 + 5 + 9 is the same as 9 + 2 + 5. So if you slide both lists by the same amount, you're adding up exactly the same set of numbers in a different order — and you get exactly the same total.
Here it is tested. Two random 8-bucket lists, slid together through all 8 positions:
slide distance by angle chi-squared Wasserstein-1 0 1.2319673088986400 0.2773124192 1.3864099180 1 1.2319673088986400 0.2773124192 0.8929874312 2 1.2319673088986400 0.2773124192 0.9436540201 3 1.2319673088986405 0.2773124192 1.2977986517 4 1.2319673088986400 0.2773124192 1.2598721832 5 1.2319673088986400 0.2773124192 1.2736155293 6 1.2319673088986400 0.2773124192 0.8929874312 7 1.2319673088986405 0.2773124192 1.5387916435 biggest disagreement across all 8 slides: 0.00000000000000044
That last figure is 4.4 ten-thousandths of a trillionth — the last digit a computer can hold. It isn't "close". It's the same number, printed with rounding dust on it.
Now look at the third column. Wasserstein-1 jumps all over the place, because it's the one stick that reads which bucket is next to which — so wrapping the buckets round genuinely breaks it. It's therefore excluded from this part of the theory. Mentioning that exclusion is what shows you understand the mechanism instead of reciting the result.
Measured on synthetic vowels: transposing the same vowel up by 6 buckets collapses the distance 61-fold (0.4611 down to 0.0075), while a genuinely different vowel stays far away (0.2911). That's a 39-fold separation between "same vowel, different pitch" and "different vowel" — and it repairs a misclassification the base engine gets wrong.
Plain version: it removes absolute pitch and keeps the spacing between the peaks — which is where the identity of a vowel actually lives.
Ours as an extension — but shift-invariant distances and quotient metrics already exist in music-information-retrieval and in group theory. This is a specific, clean instance of a known idea, not a first.
Last piece, and it's the most elegant one.
Move 8's distance has a flaw: because of how the stretching works, it breaks rule 4 — the no-shortcuts rule. So strictly it's a divergence, not a fair metric. The fix is to apply the method's own founding move to the clock instead of the sound.
Here's the observation. A stretch is a schedule: go a bit slower here, a bit faster there. That schedule is made of speed-up factors that are never negative, and over the whole word they have to add up to exactly the length of the word.
Never negative. Adds to a fixed total. That's a distribution — the same object as Move 1. So square-root it, and the stretch schedule lands on a ball too.
Once you do that:
Measured: it's 15 to 35 times more stable than plain stretching when both recordings are warped at once.
One. The clean version is a fair metric on paper. The version actually running on chopped-up digital data carries about 1–5% slack on the no-shortcuts rule. Documented, not swept under.
Two. Throwing timing away entirely helps on handwriting and hurts on speech — because in speech, timing carries identity. So the default distance keeps ordinary stretching. This isn't discarded: it's the theory that makes the whole thing a genuine metric, and it supplies the shape/timing split whenever a task wants it.
The name in the papers
SRVF — square-root velocity representation (Srivastava and others, 2011; the ball-shaped version, Su and others, 2014). Read it as "the square root of time".
And the closing symmetry: pitch shifts (Move 11) and time stretches (Move 12) are both things we want to ignore, and once set up this way, both are ignored by the same mechanism.
Everything else is a variation:
| The name | What it actually is |
|---|---|
| Probability distribution | A list of fractions that adds to 1. |
| Frame | One instant's worth of that list. |
| Simplex | The set of all lists that could possibly come out. With 3 buckets, a triangle. |
| Unit sphere | The surface of a ball of size 1. Where lists land after square-rooting. |
| Bhattacharyya coefficient | Multiply the two lists pair by pair, square-root each, add them up. A closeness score from 0 to 1. |
| Fisher–Rao distance | The angle between two points on that ball. The exact answer. Rao, 1945. |
| Ground metric | Whichever stick you use for one instant against one instant. |
| Metric | A stick obeying all four fairness rules, including no-shortcuts. |
| Divergence | A stick that obeys the first three but can break no-shortcuts. Chi-squared is one. |
| Dynamic Time Warping (DTW) | Letting one instant match several, so different speeds can be compared. 1978. |
| Geodesic | The shortest path along a curved surface. The arc, not the tunnel. |
| Slerp | Walking along that arc instead of cutting through. |
| Karcher / Fréchet mean | The average of a set of points, computed on the curved surface. |
| Temporal pooling | Averaging a whole sequence down to one summary. The thing Move 10 argues against. |
| Isometry | A change that moves things without changing any distance. Sliding all the buckets is one. |
| Quotient | Deliberately treating a whole family of variants as one thing — "same vowel regardless of pitch". |
| SRVF | The square-root trick applied to the clock. Makes the distance a fair metric and splits shape from timing. |