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.