A movie recommender you steer
Pick a starting taste. Ask for a change. See how your recommendations move. About this project
What is happening underneath
Every movie here is a point in a 256-dimensional space learned from 25 million ratings, and so are you. Each dial is a direction in that space that separates films the MovieLens tag genome scores high on one idea from films it scores low, so "eerier" means a move from where you are, and the same move lands different viewers in different places. Your requests keep their constraints (a decade, a genre, a person) until you change or remove them; the chips under the box show what is active. The full account is under How it works.
Take part in a short blinded study · eight minutes, no account: which of two lists better answers a request, the steered one or a plain re-rank?
Say what you are in the mood for
A hosted model, or the one on my machine if you pick it beside the box, turns your sentence into moves on the dials below, choosing from the 1,128 tag names and answering only with numbers. Your sentence, your position (256 numbers, not your ratings) and the dial settings are what it sees.
Where “scarier” can fall short
With the Pixar household, a move along scary can leave the list close to where it started, with A Bug’s Life still near the top. Staying within animation could preserve the viewer’s taste; the limitation is that the requested change in mood is hard to see.
Eerie is a different direction and has produced more noticeable changes for this preset. The first example asks for it explicitly. The sentence interpreter never substitutes it for scary; when a tag on the same lean is better encoded (creepy, for scary) it steers as that tag and says so in the note. Check the dials to see how each request was interpreted.
To compare from the same starting point, select the Pixar household again before trying each request.
Where you start
Stars say where you live: one five-star rating places you at that film, two average them, a 1 pushes away, and they save with your profile. vibes says where you're going tonight: a lean toward that film as a dial you can push further or reset; like the other dials it lasts 12 hours in this browser, then clears.
Or rate twenty anchor movies
Rate what you've seen; skip the rest. Your position is the rating-weighted average of the films you rated, so more ratings place you more finely.
Or import your ratings (Letterboxd or IMDb export)
Letterboxd: Settings → Import & Export → Export your data, then choose ratings.csv (or watched.csv for films you've seen but not rated). IMDb: Your Ratings → Export. Films are matched to this catalog's 13,174 titles; the rest are listed, not dropped. The file stays in your browser.
Top 10
Loading the catalog…
Worth seating?
- The seat is a film from well outside this list's neighborhood, connected to it through a concept the list shares. It sits unmarked in the middle.
- The certificate tests the connection, not whether you will like the film. Your yes or no after the reveal is the only evidence on that; the tally is on the project page.
The Sixth Sense test
Two viewers, one move. This comparison uses the eerie dial for both the Pixar household and the horror devotee, starting from each viewer’s own taste. It is a direct dial comparison, not a test of how the sentence box interprets “scarier.”
Adjust the mood
Positive values ask for more of a quality; negative values ask for less. The symbol σ marks a standardized step, scaled to how much films vary along that direction. It is not a percentage.
Fine-tune the list
What each setting does
- Ranking method — cosine compares the direction of your taste with each film’s direction. Dot product also uses the length of the film’s vector, which can give a different ranking.
- popularity β — above 0 favors films with more ratings; below 0 favors films with fewer. A separate adjustment still downweights films with little rating evidence.
- diversity λ — lower values favor a more varied list of moods and genres; 1 ranks entirely by the chosen score. The method is called maximal marginal relevance.
- explore — penalizes similarity to your own taste, so a steered list leaves your usual neighborhood. With no steer it has no direction to leave along and only adds diversity.
The line under the list shows what each setting did.
How it works
- The space. The ratings matrix is factorized by biased alternating least squares over the observed ratings only, so a missing rating is missing rather than zero; the number of factors was chosen by the one-standard-error rule on held-out error. The item factors are centered: the average film sits at the origin and every vector is a lean away from it.
- The directions. For each of the 1,128 genome tags, a logistic regression on the item factors separates the tag's top quartile from its bottom quartile; its normalized coefficient vector is the tag's direction. A tag counts as encoded when its cross-validated AUC is two standard errors from chance. The eight dials are the highest-AUC encoded tags from a pool of mood and content tags that stay at least half-orthogonal to each other.
- Your position. The centroid of the films you rated, weighted by rating minus three, so a film you gave 2 stars pushes you away from it. Computed here, in JavaScript. Before steering it is scaled to the median radius of the viewers the model was fit on, so a step means the same thing whether your taste is concentrated or spread out.
- A move. A dial at value v moves you by v·σ along its direction, σ being the catalog's spread along that direction. A sentence becomes such moves through a model on my machine, choosing from the tag names. A film you name becomes a direction from where you stand to it.
- The list. The catalog is ranked by cosine to the moved position, multiplied by n/(n+n₀) so thinly rated films with noisy vectors do not crowd the list, with the films you rated removed; the knobs above adjust that ranking. The project page has the evaluation.