본문 바로가기
데이터 과학 수학

마음을 읽는 행렬, 협업 필터링(Collaborative Filtering)과 유사도의 수학

by dexien 2026. 4. 21.

유튜브를 켜면 내가 좋아할 것 같은 영상이 뜹니다. 쿠팡에서 상품을 보면 "이 상품을 본 고객이 함께 본 상품"이 나옵니다. 이 추천들이 어떻게 작동하는지 궁금했습니다. 알고 보니 핵심은 단순했습니다. "나와 비슷한 취향을 가진 사람들이 좋아한 것을 추천한다." 이걸 수학으로 구현한 게 협업 필터링입니다.

협업 필터링(Collaborative Filtering)은 사용자들의 행동 데이터를 행렬로 표현하고, 그 행렬에서 유사도를 계산해서 빈칸을 예측하는 방식입니다. 이 연재에서 다룬 행렬 연산, 내적, SVD가 모두 여기서 만납니다. 오늘은 실제 숫자로 계산 과정을 따라가 보겠습니다.

협업 필터링 Collaborative Filtering과 유사도의 수학 마음을 읽는 행렬
마음을 읽는 행렬, 협업 필터링(Collaborative Filtering)과 유사도의 수학

사용자-아이템 행렬 — 취향을 숫자로 표현하기

협업 필터링의 첫 단계는 사용자를 행, 아이템을 열로 하는 행렬을 만드는 겁니다. 각 칸에는 사용자가 아이템에 남긴 평점이 들어갑니다. 평점이 없으면 비어있습니다.

사용자-아이템 평점 행렬:
       영화A 영화B 영화C 영화D 영화E
Alice  [5, 3, ?, 1, ? ]
Bob    [4, ?, 4, 1, 2 ]
Carol  [?, 3, ?, 2, 4 ]
Dave   [1, 2, 4, ?, 5 ]

? = 아직 보지 않은 영화 → 예측해야 할 값

추천 시스템의 목표:
Alice의 영화C 예측 평점이 높으면 → 영화C 추천
Alice의 영화E 예측 평점이 높으면 → 영화E 추천

현실에서 사용자 한 명이 모든 아이템을 소비할 수 없으니 대부분의 칸이 비어있습니다. 넷플릭스 같은 대형 서비스에서는 전체 행렬의 1~5%만 채워져 있습니다. 사용자 수억 명, 콘텐츠 수만 개로 이루어진 거대한 행렬에서 비어있는 칸을 수학적으로 예측하는 게 추천 시스템의 핵심입니다.

평점 데이터 외에 클릭, 시청 시간, 구매 여부 같은 암묵적 피드백도 활용합니다. 유튜브에서 영상을 끝까지 봤다면 높은 평점을, 10초 만에 닿았다면 낮은 평점을 준 것으로 처리합니다. 명시적 평점보다 훨씬 풍부한 데이터를 얻을 수 있습니다.


코사인 유사도 — 취향의 거리를 측정하는 방법

"비슷한 취향"을 수학적으로 측정하는 대표적인 방법이 코사인 유사도(Cosine Similarity)입니다. 두 사용자의 평점 벡터 사이의 각도를 측정합니다. 각도가 작을수록 취향이 비슷합니다.

코사인 유사도 공식:
cos(θ) = (A · B) / (||A|| × ||B||)

A · B: 두 벡터의 내적 (같은 위치 원소의 곱의 합)
||A||: 벡터 A의 크기 (L2 노름)

결과 범위: -1 ~ 1
cos(θ) = 1.0: 완전히 같은 방향 → 취향 완벽히 일치
cos(θ) = 0.0: 수직 → 취향 무관
cos(θ) = -1.0: 반대 방향 → 취향 완전히 반대

유클리드 거리와의 차이:
유클리드: 벡터의 크기(평점 개수, 점수 크기)에 영향받음
코사인: 벡터의 방향(평점 패턴)만 봄

예시: A=[1,2,3], B=[2,4,6]
유클리드 거리: √((1-2)²+(2-4)²+(3-6)²) = √14 ≈ 3.7
코사인 유사도: 1.0 (완전히 같은 방향)
→ B는 A보다 전반적으로 높게 평점을 줬지만 패턴은 동일

코사인 유사도가 추천 시스템에서 선호되는 이유는 평점 기준이 사람마다 다르기 때문입니다. 어떤 사람은 마음에 들면 5점, 어떤 사람은 4점이 최고점입니다. 크기를 무시하고 방향(패턴)만 보는 코사인 유사도가 이 차이를 자연스럽게 처리합니다.


실제 숫자로 유사도 계산해보기

Alice와 Bob의 코사인 유사도를 직접 계산해 보겠습니다. 두 사람이 공통으로 평점을 남긴 영화 A(Alice=5, Bob=4)와 영화 D(Alice=1, Bob=1)를 사용합니다.

Alice = [5, 1] (영화A=5점, 영화D=1점)
Bob = [4, 1] (영화A=4점, 영화D=1점)

내적: A·B = 5×4 + 1×1 = 20 + 1 = 21
||A|| = √(5²+1²) = √26 ≈ 5.099
||B|| = √(4²+1²) = √17 ≈ 4.123

cos(θ) = 21 / (5.099 × 4.123) ≈ 21 / 21.02 ≈ 0.999

→ Alice와 Bob의 취향 유사도 = 0.999 (거의 완벽히 일치)

Carol과의 비교:
Carol = [3, 2] (영화B=3점, 영화D=2점)
Alice와 공통: 영화D만 → Alice=[1], Carol=[2]
cos(θ) = (1×2)/(1×2) = 1.0 이지만 공통 1개뿐 → 신뢰도 낮음

→ 공통 평점이 많을수록 유사도 신뢰도 높아짐

Alice와 Bob의 유사도가 0.999로 매우 높으니 Bob이 본 영화 C(4점)를 Alice에게 추천합니다. Alice가 아직 보지 않은 영화 E도 Bob이 2점을 줬으니 추천하지 않습니다. 이렇게 유사한 사용자의 평점을 가중 평균해서 빈칸을 채우는 것이 사용자 기반 협업 필터링의 핵심입니다.


사용자 기반 vs 아이템 기반 협업 필터링

협업 필터링은 유사도를 어디서 계산하느냐에 따라 두 방식으로 나뉩니다. 두 방식 모두 코사인 유사도를 쓰지만 비교 대상이 다릅니다.

사용자 기반 (User-Based CF):
"나와 비슷한 취향의 사람들이 좋아한 것을 추천"
→ 사용자 간 유사도 행렬 계산 (n_users × n_users)
→ 사용자 수 증가 → 계산 비용 제곱으로 폭증
→ 사용자 취향이 자주 바뀌면 유사도 재계산 필요

아이템 기반 (Item-Based CF):
"내가 좋아한 아이템과 비슷한 아이템을 추천"
→ 아이템 간 유사도 행렬 계산 (n_items × n_items)
→ 아이템 특성은 안 바뀜 → 유사도 미리 계산 가능
→ 실시간 추천 속도 훨씬 빠름

실무 선택:
사용자 수 >> 아이템 수: 아이템 기반 유리
아이템 수 >> 사용자 수: 사용자 기반 고려
대부분의 서비스: 아이템 기반 선호

넷플릭스 "이 영화를 본 사람이 본 다른 영화" = 아이템 기반

희소성 문제와 콜드 스타트

협업 필터링의 가장 큰 문제는 희소성(Sparsity)입니다. 공통으로 평점을 남긴 아이템이 없으면 유사도 계산 자체가 불가능합니다.

희소성의 실제 규모:
넷플릭스 콘텐츠: 약 15,000개
사용자 1명이 본 콘텐츠: 평균 100~200개
행렬 채워진 비율: 약 1% 미만

콜드 스타트 문제:
신규 사용자: 평점 기록 없음 → 누구와도 유사도 계산 불가
신규 아이템: 평점 없음 → 어떤 아이템과도 유사도 계산 불가

해결 방법:
1. 온보딩 설문: 신규 사용자에게 선호 장르/아이템 직접 물어봄
2. 인구통계 기반: 연령, 성별, 지역으로 초기 추천
3. 콘텐츠 기반 필터링 병행: 아이템 속성으로 유사도 계산
4. 행렬 분해: 희소한 데이터에서도 잠재 요인 추출 가능

→ 실무에서는 여러 방법을 조합한 하이브리드 사용

행렬 분해 — 잠재 요인으로 빈 칸 채우기

현대 추천 시스템의 핵심이 행렬 분해(Matrix Factorization)입니다. 거대한 평점 행렬을 두 개의 작은 행렬로 분해해서 빈 칸을 예측합니다. 2006년 넷플릭스 프라이즈 대회에서 우승한 알고리즘의 핵심이 바로 행렬 분해였습니다.

행렬 분해 원리:
R ≈ P × Q^T

R: 평점 행렬 (사용자 m명 × 아이템 n개, 대부분 비어있음)
P: 사용자-잠재요인 행렬 (m × k)
Q: 아이템-잠재요인 행렬 (n × k)
k: 잠재 요인 수 (보통 10~200개)

잠재 요인의 의미:
명시적으로 정의하지 않은 숨겨진 특성
영화: 액션성, 감성, 유머, 복잡도 등
사용자: 각 요인에 얼마나 반응하는지
→ 모델이 데이터에서 스스로 발견

빈 칸 예측:
Alice의 영화C 예측 평점
= P_Alice · Q_영화C^T (내적)
= Alice의 잠재 요인 벡터와 영화C의 잠재 요인 벡터의 내적

학습 방법:
손실 = Σ(실제평점 - 예측평점)² + 규제항
경사하강법으로 P와 Q 반복 업데이트
→ 역전파와 동일한 원리

행렬 분해의 강점은 희소성에 강하다는 점입니다. 코사인 유사도는 공통 평점이 없으면 계산 불가능하지만, 행렬 분해는 있는 데이터만으로 P와 Q를 학습한 다음 내적으로 모든 빈 칸을 예측합니다. SVD 글에서 다룬 잠재 요인 개념이 여기서 그대로 적용됩니다.


협업 필터링의 한계와 현대 추천 시스템

협업 필터링만으로는 해결하기 어려운 문제들이 있습니다. 인기 편향(Popularity Bias)이 대표적입니다. 많은 사람이 본 콘텐츠가 계속 추천되고, 틈새 콘텐츠는 영원히 추천받지 못합니다. 또한 필터 버블(Filter Bubble) 문제도 있습니다. 비슷한 취향의 콘텐츠만 계속 추천받아서 새로운 장르나 관점을 접하기 어려워집니다.

이를 보완하기 위해 현대 추천 시스템은 여러 방법을 결합합니다. 협업 필터링으로 취향을 파악하고, 콘텐츠 기반 필터링으로 아이템 속성을 분석하고, 딥러닝으로 비선형 패턴을 학습하고, 의도적으로 다양성을 추가하는 알고리즘도 씁니다. 유튜브의 추천 시스템은 수백 개의 신호를 결합한 복잡한 모델이지만 그 출발점은 오늘 다룬 사용자-아이템 행렬과 유사도 계산입니다.

협업 필터링의 진화 과정을 정리하면 이렇습니다.

기술 수학적 방법 특징
기본 CF 코사인 유사도, 피어슨 상관계수 단순하지만 희소성에 취약
행렬 분해 SVD, ALS 잠재 요인 발견, 희소 데이터에 강함
딥러닝 기반 Neural CF, GNN 비선형 패턴 학습, 최신 트렌드
콘텐츠 기반 TF-IDF, Word2Vec 콜드 스타트 문제 해결에 활용

내가 영상을 클릭하고 구매 버튼을 누를 때마다 이 수학이 조용히 작동하고 있습니다. 이 연재에서 다룬 행렬 연산, 내적, SVD, 경사하강법이 모두 추천 시스템 안에 들어가 있습니다. 수학이 취향을 읽는 방식을 이해하면 알고리즘이 왜 이 콘텐츠를 추천했는지, 어떻게 하면 더 원하는 콘텐츠를 받을 수 있는지도 보이기 시작합니다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 블로그 이름