product
How Filmatic picks one movie for two people
Leads the technical side. The Filmatic app was his idea, and he created the algorithm and the framework the app runs on.
6 min read

Recommending to one person is a search problem. Recommending to two is a fairness problem wearing a search problem’s clothes, and almost every obvious answer to it is worse than picking at random.
Averaging is the obvious idea and it is wrong
Every movie in Filmatic is a long list of numbers, and so is your taste. If that sentence is new, the piece on the recommendation model covers where those numbers come from.
Given two people, you have two of these lists. The first thing anybody tries is to add them together and divide by two.
The result is genuinely bad, and it fails for a reason worth understanding rather than a bug you can patch. Taste vectors point outward in particular directions. One of you leans towards slow European drama, the other towards American crime. The midpoint of those two directions does not point at some clever synthesis of both. It points at the middle of the space, which is where the movies sit that are a bit of everything and strongly nothing.
So averaging reliably returns the most generic movie in the catalogue that neither of you objected to. It is the cinematic equivalent of a restaurant nobody hates. Both of you will sit through it and neither of you will bring it up again.
Intersecting the two lists is closer, and still not it
The next idea is better. Build a shortlist for each person, then keep only the movies on both lists.
That does produce real recommendations rather than mush, and it is the right instinct. The problem is the size of the result. Two people who genuinely watch different things have shortlists that barely touch, so the intersection comes back with two movies or none. On the nights you most need the feature, it has the least to say.
There is also a subtler failure. Being on both shortlists is a threshold test, and it throws away the information you need to rank what survives. Two movies both clear the bar, one is a solid match for both of you, the other is perfect for her and barely scraped through for him. The intersection cannot tell them apart.
Rank by the weaker half
What actually works is to keep both profiles separate all the way through.
Score every candidate against her profile. Score the same candidate against his. Now you have two numbers per movie, and the whole design comes down to how you combine them.
Add them, and you get the movie with the highest total, which is the movie one person adores and the other tolerates. A ninety and a thirty beats a sixty and a sixty on that arithmetic, and the ninety and the thirty is the evening where somebody is quietly on their phone.
So we rank on the lower of the two scores instead. The movie that wins is the one whose weaker match is strongest. Nobody gets their favourite movie of the year, and nobody gets dragged, and after a few sessions that turns out to be what people actually wanted from a shared pick.
The rule survives the edge cases too. A movie that is spectacular for one person and wrong for the other cannot win no matter how spectacular, because it is judged on its worst half.
A skip is still a skip
Anything either of you has skipped is gone before ranking starts, whatever the other person’s score for it says.
This sounds obvious and it is the rule people are most surprised by, because it means a movie your partner would love can be quietly unavailable in shared mode and neither of you finds out why. That is deliberate. A shared recommendation that overrides one person’s stated no is a feature nobody trusts twice, and the cost of losing a few good candidates is much lower than the cost of that.
When one of you has rated far more than the other
Profiles are not equally reliable. Somebody who has rated three hundred movies has a taste vector that sits somewhere specific. Somebody who joined an hour ago and rated twenty has a rough sketch, and the confidence you can place in their score is correspondingly lower.
If you ignore that, the sparse profile behaves like a very opinionated one. It has a direction, it just has not earned it, and ranking on the weaker half means that noisy direction gets a veto over everything.
So the newer profile is treated as the wider guess it is. In practice that means shared picks lean towards the region where both profiles agree with room to spare, rather than towards the exact spot where the sparse one happens to be pointing this week. It also means the feature gets noticeably better a week after both people start using the app, which is worth knowing before you judge it on the first night.
Then the boring filter, twice
A perfect shared pick that one of you cannot open is not a pick.
Availability is checked for both people, in their countries, on the services each of them actually has. This rejects more candidates than any of the interesting steps above, and it rejects them late, after all the work. Catalogues also move underneath you constantly, for reasons covered in why movies disappear from streaming, so a pair that worked last month can fail this one.
What it is bad at
Every recommendation feature has a shape of failure, and describing it is cheaper than having people discover it on their own.
It is weakest when two tastes genuinely do not overlap. Ranking on the weaker half is honest, which means when the best available movie scores poorly for one of you, the correct answer is to say so rather than to serve it anyway with confidence. A picker that always returns something is a picker that is sometimes lying.
It has no idea what kind of evening you are having. The profiles describe what you like in general, not that one of you had a terrible day and wants something undemanding. That is a real limit, and it is why the result is a suggestion with a reason attached rather than a verdict.
It does not scale past two well. The lower of two scores is a useful signal. The lowest of five is almost always a bad number, and optimising it drives a group straight back to the inoffensive middle that averaging produced. Group mode is a different problem and it needs a different rule.
Why this shape
The pattern behind all of it is that shared decisions are not an averaging problem. Nobody wants the mean of two evenings.
What people want from a shared pick is the absence of a loser. Rank on the weaker half and you get that directly, at the cost of never producing anybody’s movie of the year. For one night with two people on one sofa, that is the correct trade.
Keep reading

product
How Double Feature finds the movie to watch after yours
Pairing is not similarity. The nearest movie in the model is usually the worst thing to watch next, and the reason why explains how the whole feature is built.

product
How the Filmatic recommendation algorithm matches movies to you
No hand-waving about AI. The actual movie recommendation algorithm: what a swipe does, how movies match your taste, and what the system is bad at.

guide
Why every “movies like this” list shows the same movies
Similar-movie lists converge on the same handful of titles whatever you type. The cause is a measurable property of high-dimensional space, not laziness.