Sightline
v0.1
Source on GitHub

Ride demand from orbit

A city you have never operated in has no ride data. It has satellite imagery.

Entering a market, the question is always where inside this city do the rides come from? Answering it normally costs a pilot — months of operating at a loss to find out. Meanwhile a satellite has photographed every street, free, every five days, for a decade.

So a small convolutional network was trained on New York, where the answer is published — then handed Chicago, a city it has never seen. Click any neighbourhood below and watch it go through the network.

Trips per km² per day
Sentinel-2 © ESA/Copernicus · boundaries © City of Chicago
Inside the network

Left to right: the 1.28 km square of ground the network is handed, then the 16 most varied feature maps after each convolutional block — real activations, not illustrations. A channel keeps the same tile in every zone and is scaled against the same anchor measured across all 77, so a fainter tile really is a fainter response and switching zones shows the same filter responding differently. Resolution falls at every step — 64², 32², 16², 8² — while the number of channels climbs, and the last block's 128 numbers are what become the estimate.

Run it here 590,497 weights, no library, no server — the forward pass is 120 lines of plain JavaScript
Everything above was rendered in Python and shipped as images. Press this and the same arithmetic happens on your machine.

Watch it learn, then watch it meet a city with no answer key

Supervised learning in one control: drag the epoch. Left is New York, where every dot has a published answer the network is corrected against. Right is Chicago, run through the same weights at the same moment, with nothing to correct against.

New York fitted against these labels

Held-out New York zones. At epoch 1 the network answers roughly the same number for every zone — a flat line of dots. The cloud only turns into the diagonal because each of these dots has a real answer behind it to be corrected towards.

Chicago no labels, no correction

The same weights, the same epoch, a city the training loop never touches. It lands parallel to the diagonal but sits below it: the order is right and the level is not, and no amount of further training moves that.

Every epoch, measured

Chicago's rank correlation reaches 0.88 by the third epoch and then holds — σ of 0.005 over the remaining 55. Chicago's on the very same epochs swings from −37 to +0.63, σ of 0.219. What transfers is learned almost immediately and stays; what does not transfer never settles at all. The shipped epoch is chosen on New York's validation split alone — picking the epoch where Chicago happens to look best would be reading the answer sheet.

The ordering survives. The level does not.

Trained on 255 New York zones; scored on 77 Chicago zones in a city that was never shown to it, in any form.

New Yorkheld-out zones, same city
rank ρ
median error
Chicagonever seen, in any form
rank ρ
median error

Shown a city it has never encountered, the network still knows which zones are busier than which — rank correlation barely moves. What collapses is the absolute level. New York runs at a median of 744 trips/km²/day and Chicago at 128: a six-fold gap that is market adoption, taxi regulation and transit competition. None of that is visible from orbit, and no larger network would find it.

The map a city gets before it has any data of its own

Chicago drawn only as its streets, every one tinted by the demand the network predicts for the zone it runs through. Grey is outside the 77 community areas, where there is no estimate.

Chicago's street network, each street coloured by predicted ride demand

Not one ride record from this city went into a single colour here. The Loop burns, the North Side runs warm, the South and West sides cool — an ordering the trip data agrees with at ρ 0.88, produced by a network that has never seen a Chicago trip. 68,416 streets, 14,713 km, from OpenStreetMap.

Where it is right, and how it is wrong

Every Chicago zone, measured against predicted

Both axes log scale; the dashed diagonal is a perfect call. The cloud runs parallel to it but flattened — quiet zones over-called, the busiest under-called. That is the level error, drawn. The highlighted point is the zone selected on the map.

How much local truth it takes to fix the level

One scalar offset fitted on k zones where real demand is known, 400 random draws each. One zone halves the error. Past five, more local data buys nothing — what is left is no longer level error.