Methodology
How TasteLab actually works.
The short version is on this page first, in plain English. Below that is the full technical detail, because if you are going to trust a number you should be able to check how it was worked out.
In plain English
You bring a catalog
A list of the things you could show people — songs, articles, videos, products, courses. A title is the only column we actually need.
You describe some listeners
Made-up profiles: someone who loves new things, someone who sticks to favourites, someone who just signed up. You invent them; they are not real people.
We pretend they use your product
A few hundred imaginary browsing sessions. Each time, we pick what to show using whichever strategy you chose, and note what happened.
At the end you get ten numbers. The important ones are usually how good the matches were and how much of your catalog anyone actually saw. Almost every recommendation strategy trades one of those for the other, and the whole point of TasteLab is to show you the size of that trade before you build anything.
Everything below is the technical detail behind those numbers. You do not need it to use the product.
The technical version
For engineers evaluating whether the numbers mean anything. Seven steps, no model involved in producing any figure.
- 01
Build the feature space
Every catalog item becomes a sparse unit vector over categories, tags, creator identity, a popularity band and an energy band. The vocabulary is built deterministically from your own catalog, so the same import always produces the same space.
- 02
Build the audience vector
Preferred categories and tags enter as positive components; disliked categories enter as negative ones. An audience with no stated preference produces a zero vector, which yields a neutral affinity of 0.5 for every item rather than a false signal.
- 03
Derive behavioural associations
Positive events within a session form item-to-item co-occurrence counts, normalised by the geometric mean of each item’s frequency. With no event data the behavioural signal is dropped entirely and the remaining weights are re-normalised — the run records that this happened.
- 04
Score every candidate
Five signals — affinity, popularity, behavioural association, novelty and recency — are computed per item, each on a 0–1 scale, then combined using the strategy’s normalised weights.
- 05
Re-rank
Greedy maximal-marginal-relevance selection. Each slot is penalised by the candidate’s maximum similarity to everything already chosen, by a repetition penalty from that user’s history, and shifted by seeded exploration noise.
- 06
Simulate responses
Each simulated persona responds to each impression through a transparent acceptance model built from affinity, novelty fit, popularity fit and repetition fatigue. All randomness is seeded.
- 07
Calculate metrics
Ten metrics computed arithmetically from the run’s output. No model is involved at any point in producing a number.
The eight strategies
Signal weights are normalised to sum to 1 before scoring, so only their ratios matter. Diversity, exploration and the repetition penalty are independent controls applied during re-ranking, not part of the signal budget.
Popularity Baseline
Ranks by normalised popularity with a light recency tilt.
The control arm for every comparison. It ignores individual preference almost entirely, so it shows what your catalog looks like when nothing is personalised. Expect strong apparent relevance and very poor catalog coverage.
- Content affinity
- 5%
- Popularity
- 85%
- Behavioural association
- 0%
- Novelty
- 0%
- Recency
- 10%
diversity 0exploration 0repeat penalty 10Content Affinity
Matches audience preferences against categories, tags and metadata.
Scores each item by overlap between the audience preference vector and the item feature vector. Works on day one with no behavioural data, and is the usual starting point for cold catalogs.
- Content affinity
- 80%
- Popularity
- 5%
- Behavioural association
- 0%
- Novelty
- 5%
- Recency
- 10%
diversity 10exploration 5repeat penalty 20Behavioral Co-occurrence
Uses session co-occurrence between items to estimate relationships.
Builds an item-to-item association matrix from imported or synthetic events, then scores candidates by their association with the audience’s strongest affinities. Requires event data; without it TasteLab re-normalises the remaining signals and says so.
- Content affinity
- 15%
- Popularity
- 10%
- Behavioural association
- 65%
- Novelty
- 5%
- Recency
- 5%
diversity 10exploration 5repeat penalty 25Hybrid
Blends affinity, behavioural association and popularity.
The configuration most production systems converge on. Usually posts the highest relevance proxy while quietly concentrating exposure in a small slice of the catalog — which is exactly what the comparison view is for.
- Content affinity
- 35%
- Popularity
- 20%
- Behavioural association
- 25%
- Novelty
- 10%
- Recency
- 10%
diversity 20exploration 10repeat penalty 30Discovery Balanced
Trades a little relevance for materially wider catalog exposure.
Raises the novelty signal and the exploration control so lower-popularity items can enter the list, while keeping affinity dominant. Designed to answer “how much relevance does discovery actually cost?”.
- Content affinity
- 40%
- Popularity
- 5%
- Behavioural association
- 15%
- Novelty
- 30%
- Recency
- 10%
diversity 35exploration 25repeat penalty 45Diversity First
Maximises dissimilarity between consecutive recommendations.
Applies aggressive maximal-marginal-relevance re-ranking so each slot is penalised by its similarity to everything already selected. Reduces filter-bubble risk and repetition; costs the most relevance of any strategy here.
- Content affinity
- 35%
- Popularity
- 10%
- Behavioural association
- 10%
- Novelty
- 20%
- Recency
- 25%
diversity 60exploration 20repeat penalty 50Cold Start
Explicit preferences, catalog priors and controlled exploration.
For users with little or no history. Leans on stated preferences plus catalog-level priors, and deliberately explores so the system can learn something from the first few sessions instead of collapsing onto the head of the catalog.
- Content affinity
- 50%
- Popularity
- 25%
- Behavioural association
- 0%
- Novelty
- 10%
- Recency
- 15%
diversity 30exploration 30repeat penalty 35Custom Weighted
Define your own signal weights and control parameters.
Every signal weight and control is yours to set. Signal weights are normalised to sum to 1 before scoring, so only their ratios matter; controls are applied independently during re-ranking.
- Content affinity
- 35%
- Popularity
- 20%
- Behavioural association
- 25%
- Novelty
- 10%
- Recency
- 10%
diversity 20exploration 10repeat penalty 30
The ten things we measure
Each one is plain arithmetic over what the simulation produced. The AI is allowed to explain these numbers and is structurally prevented from producing them.
| What we measure | Which way is good | The question it answers | How it is worked out |
|---|---|---|---|
| Good matchesRelevance proxy | ↑ Higher | Did people get shown things they'd actually like? | Mean of 0.7 × content affinity + 0.3 × popularity fit across every recommended item, weighted by exposure count. Affinity is the cosine between the audience preference vector and the item feature vector, mapped to 0–1. This is a proxy computed from your inputs — it is not measured engagement. |
| VarietyDiversity | ↑ Higher | Was there enough variety, or the same things over and over? | 1 − mean pairwise cosine similarity over every item pair in a simulated user’s full sequence of impressions, averaged across users. Similarity uses the catalog feature space (category, tags, creator, popularity band, energy band). A repeated item scores a similarity of 1 against its earlier appearance, so recycling the same items between sessions lowers this figure. |
| Beyond the hitsNovelty | ↑ Higher | Did people discover anything, or only the obvious popular stuff? | Exposure-weighted mean of (1 − normalised popularity). The detail panel also reports the share of exposures drawn from the least-popular 80% of the catalog. |
| Catalog reachedCatalog coverage | ↑ Higher | How much of your catalog did anyone actually see? | Distinct items exposed ÷ total eligible catalog items. Items never shown to anyone are listed in the detail panel. |
| CrowdingPopularity concentration | ↓ Lower | Is attention piling onto a few items while the rest get nothing? | Gini coefficient of the exposure distribution. 0 means every item was shown equally often; 1 means a single item absorbed all exposure. The Lorenz curve behind it is plotted in the concentration chart. |
| RepeatsRepetition rate | ↓ Lower | How often did someone get shown the same thing twice? | Repeat impressions ÷ total impressions, where a repeat is any item a given simulated user has been shown in an earlier session of the same run. |
| Happy surprisesSerendipity proxy | ↑ Higher | Did people find things they liked but wouldn't have guessed? | Share of exposures whose relevance proxy is ≥ 0.55 while their maximum cosine similarity to the segment’s 12 most obvious items is < 0.5. |
| Brand-new usersCold-start resilience | ↑ Higher | How well does this work for someone you know nothing about? | The same strategy is re-run against a cold variant of each segment (preferences reduced to a single anchor, behavioural history removed). Scored as 0.5 × cold relevance + 0.5 × (1 − cold concentration). |
| Creators reachedCreator coverage | ↑ Higher | How many of your creators got any attention at all? | Distinct creators exposed ÷ distinct creators in the catalog. The detail panel reports the exposure share held by the top creator. |
| Categories reachedCategory coverage | ↑ Higher | How many of your categories got any attention at all? | Distinct categories exposed ÷ distinct categories in the catalog, with the per-category exposure share in the detail panel. |
CSV formats
Catalog import
Only title is required. Every other column is optional and improves the simulation. Unrecognised headers can be mapped by hand or set to ignore.
- id
- title
- creator
- category
- tags
- description
- popularity
- published_at
- duration
- price
- metadata
id,title,creator,category,tags,popularity,published_at lum-001,Slow Harbour Lights,Vera Ostlund,Ambient,"calm; evening",0.91,2026-01-12
Event import
user_id, item_id and event_type are required. Item ids must already exist in the catalog.
- impression
- view
- click
- save
- like
- skip
- complete
- add_to_cart
- purchase
- dismiss
- share
user_id,item_id,event_type,timestamp,session_id u-0001,lum-001,view,2026-05-02T09:14:00Z,s-0001
Invalid rows are never silently dropped
What TasteLab cannot tell you
TasteLab is a simulation. It is a strong hint about how a recommendation strategy would behave, not a prediction of what your actual users will do. Always confirm with a real test before you ship.
- It cannot tell you whether people will use your product more. It has never seen a real user.
- It cannot replace talking to actual customers. The listener types are made up by you.
- It cannot replace a real A/B test. There is no traffic and no real feedback here.
- It cannot tell you how big a change needs to be to matter. That comes from your own data.
- It knows nothing about licensing, availability, editorial choices or business rules.
- It does not profile real people, and describes listeners only by what they like.
What it is genuinely good at: showing you, before you build anything, which parts of your catalog nobody would ever see, how much attention piles onto the same few items, and exactly what you give up by showing people more variety. See a worked example.