1. Definition

Novelty measures how unexpected or unfamiliar the recommended items are to the user.

  • A system that only recommends popular items (e.g., “Avengers: Endgame”) may be accurate but not novel.
  • A system that recommends less popular or less obvious items (e.g., an indie film) increases novelty.

Novelty = how much the system helps users discover things they didn’t already know.


2. Intuition

  • Low Novelty: Recommending Starbucks coffee to a coffee lover (they already know it).
  • High Novelty: Recommending a niche local coffee roaster they’ve never heard of.

3. How It’s Measured

One common measure:

Self-Information of Popularity

$Novelty(i) = – \log_2 \; P(i)$

  • $P(i)$ = probability of item $i$ being chosen (popularity, e.g., frequency in training data).
  • Rare (less popular) items → higher novelty.

For a user’s recommendation list:

$Novelty@K = \frac{1}{K} \sum_{i=1}^K -\log_2 P(i)$


4. Example

Catalog = 1000 movies

  • Movie A: very popular (chosen by 50% of users) → Novelty = –log₂(0.5) = 1
  • Movie B: niche (chosen by 1% of users) → Novelty = –log₂(0.01) ≈ 6.64

Movie B has higher novelty.


5. Why It Matters

  • User Experience: Increases chance of “pleasant surprises.”
  • Business: Helps promote long-tail items (not just blockbusters).
  • Exploration vs. Exploitation: Balances recommending what users like vs. exposing them to new options.

6. Limitations

  • High novelty ≠ good recommendation.
  • Recommending obscure but irrelevant items frustrates users.
  • Must balance novelty with accuracy and relevance.

7. Python Example

import numpy as np

def novelty_at_k(recommendations, item_popularity, k=5):
    """
    recommendations: list of recommended item IDs
    item_popularity: dict mapping item ID -> probability of being chosen
    """
    top_k = recommendations[:k]
    scores = [-np.log2(item_popularity[i]) for i in top_k]
    return np.mean(scores)

# Example popularity distribution
item_popularity = {1: 0.5, 2: 0.1, 3: 0.01, 4: 0.2, 5: 0.19}
recommendations = [1, 2, 3, 4, 5]

print("Novelty@5:", novelty_at_k(recommendations, item_popularity, k=5))

Summary

  • Novelty = recommending items that are less popular and more surprising to the user.
  • Measured via item popularity (self-information).
  • High novelty = long-tail recommendations.
  • Needs balance with accuracy → novelty without relevance is not useful.