Hoppa till innehållet
AI-grafen
E· Universitetklassisk-ml· ca 60 min· utvecklande· verifierad 2026-09-20

Rekommendationssystem

Kunna bygga ett enkelt rekommendationssystem med kollaborativ filtrering.

Förkunskaper

Intuition

Kollaborativ filtrering: «användare som liknar dig gillade X». Bygger på beteendemönster, inte på innehållet.

Innehållsbaserad: «det här liknar det du gillade». Bygger på egenskaper hos objekten.

Matrisfaktorisering är standardmetoden för det första: betygsmatrisen R (användare × objekt) är gles men ungefär lågrangig — smaker kan beskrivas med ett fåtal dolda faktorer. Faktorisera R ≈ U·Vᵀ där U är användarfaktorer och V objektfaktorer, och fyll i tomrummen.

Kallstart är systemets svåraste problem: en ny användare har ingen historik, ett nytt objekt inga betyg. Lösningen är hybrid — använd innehåll och metadata tills beteendedata finns.

Kod

import numpy as np

def als(R, mask, k=10, lam=0.1, iterationer=20, seed=0):
    """Alternating least squares på en gles betygsmatris."""
    rng = np.random.default_rng(seed)
    n, m = R.shape
    U = rng.normal(0, 0.1, (n, k)); V = rng.normal(0, 0.1, (m, k))
    for _ in range(iterationer):
        for i in range(n):                       # fixera V, lös för U
            j = mask[i]
            if j.any():
                Vj = V[j]
                U[i] = np.linalg.solve(Vj.T @ Vj + lam * np.eye(k), Vj.T @ R[i, j])
        for j in range(m):                       # fixera U, lös för V
            i = mask[:, j]
            if i.any():
                Ui = U[i]
                V[j] = np.linalg.solve(Ui.T @ Ui + lam * np.eye(k), Ui.T @ R[i, j])
    return U, V

def rekommendera(U, V, anvandare, redan_sedda, n=5):
    poang = U[anvandare] @ V.T
    poang[list(redan_sedda)] = -np.inf
    return np.argsort(-poang)[:n]

Utvärdering: RMSE på betyg mäter fel sak. Användaren ser en lista, så mät rankning: precision@k, recall@k, nDCG@k, och täckning (hur stor del av katalogen rekommenderas någonsin?).

Två effekter att designa mot:

  • Popularitetsbias — systemet rekommenderar det populära, vilket gör det populärare. Motverka med diversifiering.
  • Filterbubbla — användaren ser bara mer av samma. Lägg medvetet in utforskning (epsilon-greedy eller banditer).

AI-grafens övningsval är en variant av samma problem: banditalgoritmen väljer förklaringsdjup, och utforskningen är inbyggd just för att inte fastna.

Behärskning innebär

  • Bygger kollaborativ filtrering med matrisfaktorisering
  • Hanterar kallstartsproblemet
  • Utvärderar med rankningsmått

Logga in för att göra övningarna och bygga upp din behärskning.

Källor

Alla källor och licenser