추천 시스템의 작동 방식
I 추천 시스템 이는 가장 널리 보급되고 수익성이 높은 응용 프로그램 중 하나입니다. 기계 학습. Amazon, Netflix, Spotify, YouTube 등 거의 모든 곳에서 추천을 제공합니다. 사용자 경험을 개인화하는 플랫폼입니다. 목표는 사용자 선호도를 예측하는 것입니다. 아직 발견하지 못한 관련 콘텐츠를 제안해 보세요. 아마존 매출의 35%가 차지하는 것으로 추산됩니다. Netflix에서 시청하는 콘텐츠의 80%는 추천 시스템에서 나옵니다.
세 가지 주요 접근 방식이 있습니다. 협업 필터링 (행동에 따라 유사한 사용자 중), 콘텐츠 기반 필터링 (아이템 특성에 따라 다름) 그리고 하이브리드 접근 방식 두 가지를 결합하여 각각의 한계를 극복합니다.
이 기사에서 배울 내용
- 협업 필터링: 사용자 기반 및 항목 기반
- 콘텐츠 기반 필터링: 기능 유사성
- 행렬 분해: SVD 및 NMF
- 하이브리드 시스템과 콜드 스타트 문제
- 평가 지표: Precision@K, NDCG, RMSE
- Python을 사용한 실제 구현
협업 필터링
Il 협업 필터링 과거에 비슷한 취향을 가진 사용자들이 그들은 앞으로도 비슷한 취향을 갖게 될 것이다. 거기 사용자 항목 매트릭스 기본적인 데이터 구조는 다음과 같습니다. 행은 사용자, 열은 항목, 값은 평가(또는 상호 작용)입니다. 이 매트릭스 일반적으로 많이 뿔뿔이 흩어진: 각 사용자는 아주 작은 부분과만 상호작용했습니다. 사용 가능한 항목 중
Il 사용자 기반 CF 타겟 사용자와 유사한 사용자를 찾아 해당 사용자에게 추천하는 아이템 그들은 감사했습니다. 그만큼'아이템 기반 CF 사용자가 좋아하는 것과 유사한 항목을 찾아 해당 위치에 배치합니다. 추천합니다. 유사성은 일반적으로 다음과 같이 측정됩니다. 약간의 유사성 또는 피어슨 상관관계.
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# User-Item Matrix (0 = non valutato)
# Righe: utenti, Colonne: film
ratings = np.array([
[5, 3, 0, 1, 4], # Utente 0
[4, 0, 0, 1, 5], # Utente 1
[1, 1, 0, 5, 0], # Utente 2
[0, 0, 5, 4, 0], # Utente 3
[0, 3, 4, 0, 0], # Utente 4
])
film_names = ['Matrix', 'Inception', 'Notebook', 'Titanic', 'Interstellar']
# --- USER-BASED CF ---
# Calcola similarità' tra utenti (usando solo film valutati in comune)
user_similarity = cosine_similarity(ratings)
np.fill_diagonal(user_similarity, 0) # escludi auto-similarità'
def predict_user_based(user_id, item_id, ratings, similarity, k=2):
"""Predici il rating dell'utente per un item."""
# Trova i k utenti più' simili che hanno valutato l'item
item_ratings = ratings[:, item_id]
rated_mask = item_ratings > 0
rated_mask[user_id] = False # escludi l'utente stesso
if not rated_mask.any():
return 0
sim_scores = similarity[user_id][rated_mask]
user_ratings = item_ratings[rated_mask]
# Top-k più' simili
top_k_idx = np.argsort(sim_scores)[-k:]
top_sims = sim_scores[top_k_idx]
top_ratings = user_ratings[top_k_idx]
if top_sims.sum() == 0:
return 0
return np.dot(top_sims, top_ratings) / top_sims.sum()
# Predizioni per Utente 0 su film non visti
user = 0
print(f"Raccomandazioni per Utente {user}:")
for item in range(ratings.shape[1]):
if ratings[user, item] == 0:
pred = predict_user_based(user, item, ratings, user_similarity)
print(f" {film_names[item]:<15s}: rating predetto = {pred:.2f}")
콘텐츠 기반 필터링
Il 콘텐츠 기반 필터링 사용자가 이미 평가한 항목과 유사한 항목을 추천합니다. 기반으로 형질 항목(영화 장르, 감독, 배우, 아티스트, 장르, 음악의 경우 BPM). 각 항목은 특징 벡터로 표현되며 유사성은 항목 간은 코사인 유사도로 계산됩니다. 아이템의 콜드 스타트 문제가 발생하지 않습니다. 특성을 알고 있지만 사용자 프로필 외부의 항목을 추천할 수는 없습니다.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# Database film con descrizioni
films = {
'Matrix': 'sci-fi action cyberpunk hacker virtual reality',
'Inception': 'sci-fi action dreams psychological thriller',
'Notebook': 'romance drama love story emotional',
'Titanic': 'romance drama historical ship love',
'Interstellar': 'sci-fi space exploration time gravity',
'Blade Runner': 'sci-fi cyberpunk android dystopia',
'Pride and Prejudice': 'romance historical drama society',
'Dark Knight': 'action superhero crime thriller',
}
# Crea matrice TF-IDF dalle descrizioni
film_names = list(films.keys())
descriptions = list(films.values())
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(descriptions)
# Calcola similarità' tra tutti i film
item_similarity = cosine_similarity(tfidf_matrix)
def recommend_content_based(liked_films, all_films, similarity, n=3):
"""Raccomanda film simili a quelli apprezzati."""
liked_idx = [all_films.index(f) for f in liked_films if f in all_films]
# Media della similarità' con i film apprezzati
scores = np.zeros(len(all_films))
for idx in liked_idx:
scores += similarity[idx]
scores /= len(liked_idx)
# Escludi film gia' visti
for idx in liked_idx:
scores[idx] = -1
# Top-N raccomandazioni
top_idx = np.argsort(scores)[::-1][:n]
return [(all_films[i], scores[i]) for i in top_idx]
# Raccomanda basandosi sui film apprezzati
liked = ['Matrix', 'Interstellar']
recs = recommend_content_based(liked, film_names, item_similarity)
print(f"Ti sono piaciuti: {liked}")
print("Raccomandazioni:")
for film, score in recs:
print(f" {film:<25s} (score: {score:.3f})")
행렬 분해: SVD
La 행렬 분해 희소 사용자 항목 행렬을 두 개의 저밀도 행렬로 분해합니다. 차원: 하나는 사용자용이고 다른 하나는 항목용입니다. 이 행렬의 곱은 다음과 같습니다. 원본 행렬을 사용하여 누락된 값을 예측으로 채웁니다. SVD(특이값 분해) e NMF(음이 아닌 행렬 분해) 가장 많이 사용되는 기술이다. 요인 잠재 개념은 선호하는 장르나 서술 스타일과 같은 추상적인 개념을 포착합니다.
콜드 스타트 문제
Il 콜드 스타트 문제 추천 시스템의 가장 큰 과제는 다음과 같습니다. 추천하는 방법 새로운 사용자 우리는 누구의 취향을 모르나요? 추천하는 방법 에 새 항목 아직 아무도 평가하지 않았나요? 해결 방법은 다음과 같습니다. 기본 설정 요청 이니셜(온보딩 퀴즈), 인구통계학적 정보 활용, 콘텐츠 기반 결합( 항목에 대한 콜드 스타트) 협업 필터링을 사용하고 인기 기반 추천을 대체 수단으로 사용합니다.
협업 vs 콘텐츠 기반: 협업 필터링으로 예상치 못한 선호도 발견 (우연히) 그러나 콜드 스타트로 어려움을 겪습니다. 콘텐츠 기반에는 다른 사용자에 대한 데이터가 필요하지 않지만 그대로 유지됩니다. 사용자 프로필(필터 버블)에만 국한됩니다. 하이브리드 시스템은 두 가지 장점을 결합합니다. 업계의 표준 선택입니다.
평가 지표
추천 시스템의 측정항목은 측정항목으로 나뉩니다. 평점 예측 (RMSE, MAE) 및 지표 순위 (정밀@K, 리콜@K, NDCG). 정밀@K Top-K에서 추천된 항목 중 얼마나 관련성이 있는지를 측정합니다. NDCG(정규화 할인 누적 게인) 위치를 고려합니다. 첫 번째 위치에 있는 관련 항목은 다음 항목 중 하나보다 더 가치가 있습니다. 십일조. 적중률 적어도 하나의 관련 항목이 나타날 확률을 측정합니다. 추천.
핵심 사항
- 협업 필터링은 유사한 사용자를 활용합니다. 콘텐츠 기반은 항목 기능을 활용합니다.
- 코사인 유사성은 유사성을 측정하기 위한 표준 측정항목입니다.
- SVD(행렬 분해)는 사용자 항목 행렬을 잠재 요인으로 분해합니다.
- 콜드 스타트 문제에는 하이브리드 전략과 지능형 폴백이 필요합니다.
- Precision@K와 NDCG는 권장 사항을 평가하는 데 가장 중요한 지표입니다.
- 하이브리드 시스템(협업 + 콘텐츠 기반)은 업계 표준입니다.







