티스토리 뷰

6.2 유사도 계산

유사도란 두 객체가 얼마나 유사한지 나타내는 척도이다. 두 문서 간의 유사도 평가와 협업 필터링에 자주 사용하는 자카드 계수와 코사인 유사도, 그리고 단어의 유사도 평가에 사용하는 편집 거리에 대해 알아보자. 자카드 계수와 편집 거리는 문서 안의 문자열을 그대로 사용하여 유사도를 계산할 수 있다. 코사인 유사도는 문서안의 문자열의 빈도를 사용한다.

 

1) 자카드 계수 : 두 집합이 공유하는 원소 수에 기반한 유사도

집합 S와 T가 있을 때, 두 집합의 자카드 계수는 두 집합의 교집합의 원소 수를 합집합의 원소 수로 나눈 값이다.

 

|S∩T| / |S∪T|

 

영화 줄거리에 출현하는 단어와 전체 단어 사이에는 다음과 같은 관계가 있다.

* P00 : 영화 1과 영화 2의 줄거리에 사용되지 않은 단어

* P01 : 영화 1 줄거리에만 사용된 단어

* P02 : 영화 2 줄거리에만 사용된 단어

* P11 : 영화 1과 영화 2의 줄거리에 동시에 사용된 단어

 

단순히 생각해보면 영화 1과 영화 2의 유사도는 P11 / (P00 + P01 + P02 + P11)이 될 것 같다. 이렇게 계산하는 유사도를 단순 일치 계수라고 한다. 즉, 두 영화 줄거리에 공통으로 사용되는 단어를 모든 단어 수로 나눈 것이다. 하지만 한 영화의 줄거리 소개에 사용되는 단어 수가 모든 단어 수보다 월등히 적으므로 위 식을 사용할 경우 P00의 값이 다른 값에 비해 굉장히 크게 된다. 

이렇게 데이터 하나에 존재하는 피처 수가 가능한 피처 수에 비해 월등하게 적은 경우 데이터가 희박하다고 표현한다. 자카드 계수는 이렇게 희박한 데이터 간의 유사도를 측정하는 데 유용하다.

 

2) 코사인 유사도 : 두 벡터 사이의 각도에 기반한 유사도

두 벡터 사이의 각도를 -1부터 1 사이의 값으로 나타내는 척도이다. 두 벡터가 같은 방향(두 벡터 사이의 각도가 0도)이면 1, 두 벡터가 완전 반대 방향(두 벡터 사이의 각도가 180도)이면 -1이 된다. 값이 1일 경우 벡터 간의 유사도가 크다는 거고, -1일 경우 유사도가 매우 작다는 것이다.

 

sim(X,Y)=X·Y / |X||Y|

 

벡터의 크기를 무시하고 각도를 이용하여 유사도를 계산한다. 코사인 유사도는 문서 길이(즉, 문서 안의 단어 수)에 영향을 받지 않기 때문에 유클리드 거리보다 문서 유사도 계산에 훨씬 자주 쓰인다.

 

3) 편집 거리 : 문자열을 편집하는 데 필요한 연산 수에 기반한 유사도

한 문자열을 다른 문자열로 변환시킬 때 필요한 연산의 수이다. 이때 연산 횟수가 많을수록 거리가 멀다고 정의한다. 문자열에 대해 가능한 연산은 문자 삽입, 삭제, 대체, 전치가 있다. 편집 거리는 허용하는 연산에 따라 종류가 나뉘는데, 예를 들어 대체 연산만 허용하는 해밍 거리와 삽입, 삭제, 대체 연산을 허용하는 레벤슈타인 거리 등이 있다. 문자열 비교 시 가장 자주 사용하는 거리는 레벤슈타인 거리이다.

 

예를 들어, 다음과 같은 문자열이 있다고 가정한다.

S1 = abcd

S2 = acfdg

 

S1을 S2로 만들기 위해서는

1. b 삭제

2. f 삽입

3. g 삽입

3번의 연산을 겨쳤으므로 편집 거리(S1, S2) 는 3이 된다.

 

편집 거리는 시리즈물의 제목을 찾는 데 유용하다. 또한 문서 안의 오탈자를 고려하여 유사도를 측정하는 데도 유용하다.

 

6.3 내용 기반 추천 시스템

사용자가 과거에 좋은 별점을 준 영화와 비슷한 영화를 추천한다. 그렇다면 어떤 영화가 비슷한 영화인가? 단순히 생각하면 영화 내용이 같으면 될 것 같지만 모든 문장이 같을 수는 없을 테니 영화 내용 소개 문서 안에서 사용된 비슷한 단어가 비슷하면 될 것이다. 비슷한지 여부를 판별하는 건 유클리드 거리이니, 원-핫 인코딩 방식을 적용해 수치 데이터로 바꾼 후 문서 안의 유클리드 거리로 계산하면 될 것이다. 하지만 문제가 있다. 일반적으로 문서에는 사용된 단어가 굉장히 많고, 출현 빈도가 다르며, 같은 단어라도 다른 의미로 쓰일 수 있다.

 

이 문제를 해결하기 위해 문서 내의 모든 단어를 사용하는 대신 문서에 나오는 중요 단어를 피처로 추출하여 비교한다. 그리고 문서 간 유사도를 계산하기 위해 유사도 계산법을 이용하면 된다.

 

6.4 협업 필터링

다른 사용자의 구매 이력을 이용해서 영화를 추천하는 방법이다. 한 사용자의 구매 이력만 사용하는 내용 기반 추천 시스템과 달리 협업 필터링은 여러 사용자 혹은 여러 아이템 정보를 동시에 사용하여 추천한다.

 

상품, 사용자, 벌점의 관계를 이용한다. 이런 관계를 행렬로 표시한 것을 유틸리티 행렬이라고 한다. 유틸리티 행렬은 '사용자 수 x 상품 수(혹은 상품 수 x 사용자 수)' 크기의 행렬이다. 행렬의 각 원소는 사용자가 상품에 준 점수를 나타낸다. ?는 사용자가 상품에 아직 점수를 주지 않은 항이다.

 

별점 예측 기법으로는 사용자/상품 기반 협업 필터링과 잠재성 요인 모델이 있으며, 성능 평가에는 평균 제곱근 편차를 사용한다.

 

1) 평균 제곱근 편차

사용자가 입력할 별점을 되도록 실제값에 가깝게 예측하는 것(근사)이 추천 시스템의 목표이다. 실제 별점과 근사 별점의 차가 적을수록 좋은 예측이 된다. 이를 평가하는 것이 평균 제곱근 편차Root Mean Square Error이다.

 

실제 별점이 들어있는 행렬을 M, 예측한 별점이 들어있는 행렬을 M', 행렬의 항을 각각 m_ij, m'_ij로 나타내고, 유틸리티 행렬의 원소 수를 N이라 할 때, 평균 제곱근 편차는 다음과 같이 계산한다.

 

{ ∑(m_ij-m'_ij)^2/N }^1/2

 

즉, 평균 제곱근 편차는 예측값과 실제값의 차이를 제곱한 값의 평균의 제곱근이다. 예측값과 실제값의 차이가 적을수록, 또 예측값과 실제값의 차이가 적은 항이 많을수록 이 값은 작아진다. 그러므로 값이 적을수록 좋은 예측이다.

 

2) 사용자 기반, 상품 기반 협업 필터링

사용자 간의 유사도를 계산할 때는 사용자가 본 영화와 별점을 이용한다. 자카드 계수를 사용할 경우에는 두 사용자가 본 영화 중 공통된 영화가 많을수록 두 사용자가 비슷하다고 보는데, 이 경우 영화의 별점 정보를 무시하게 되므로 적절하지 않다. 예를 들어 두 사용자가 완전히 같은 영화를 봤더라도 상반되게 별점을 줬다면 두 사용자의 영화 취향이 비슷하다고는 할 수 없다. 따라서 상품에 별점과 같은 선호도 정보가 있을 때는 코사인 유사도를 계산하는 것이 좋다.

 

1. 열마다 별점 평균값 구하기

2. 각 별점에서 평균값 빼기

3. 미지항을 0으로 채우기

 

상품 기반 추천 방식으로 영화를 추천할 경우 영화 정보 등을 이용하여 유사도를 계산하므로 기본적으로는 내용 기반 추천 시스템에서 사용하는 방식과 같다. 카테고리나 가격 같이 피처가 정해져 있는 상품은유사도 계산이 쉬우므로 실전에서는 사용자 기반 협업 필터링보다 상품 기반 협업 필터링을 더 자주 쓴다.

 

r_xi = b_xi + ∑_j(S_ij)·(r_xj-b_xj) / ∑_j(S_ij)

b_xi = μ+b_x+b_i

 

3) 잠재성 요인 모델

사용자/상품 기반 협업 필터링은 상품이나 사용자의 유사도를 계산해서 별점을 예측하지만 잠재성 요인 모델은 유사도를 계산하지 않고 유틸리티 행렬로 별점을 직접 예측한다. 잠재성 요인 모델은 유틸리티 행렬이 두 행렬(사용자 요인 행렬, 별점 요인 행렬)의 곱으로 이루어져있다고 가정한다. 잠재성 요인 모델에서 행렬을 분해하는 한 방법인 특이값 분해에 대해 알아보자.

 

** 특이값 분해

행렬 분해는 행렬 하나를 여러 행렬의 곱으로 분해하는 방법이다. 이 방법에는 여러 가지가 있지만, 그중에서 가장 널리 사용되는 방법은 특이값 분해Singular Value Decomposition(SVD)와 고유벡터 분해eigen vector decomposition이다.

 

행렬 A가 mxn 행렬일 때, A를 특잇값 분해하면 크기 mxm의 행렬 U, 크기 mxn의 행렬 ∑, 크기 nxn의 행렬 V로 분해할 수 있다.

 

특잇값 분해는 계산에 시간이 많이 걸리기 때문에 일반적으로 고윳값이 큰 고유벡터 k개만으로 U와 V를 만든다. 이를 절단 특잇값 분해라고 한다. 적은 수의 고유벡터를 사용하여 만들어진 U와 V의 곱은 원래의 행렬과 완전히 같지는 않지만 원래의 행렬에 가까운 행렬(근사 행렬)을 만들어낼 수 있다. 따라서 절단 특잇값 분해는 차원 축소에 이용되기도 한다.

 

절단행렬 분해를 크기가 '사용자 수 x 영화 수'인 유틸리티 행렬에 적용하면 유틸리티 행렬을 크기가 '사용자 수 x k'인 사용자 요인 행렬 X와 크기가 '영화 수 x k'인 영화 요인 행렬 Y로 나눌 수 있다. 여기서 k는 원래 사용자 수 및 영화 수보다 작다. 그리고 이 행렬의 곱을 구하는 것으로 원래 행렬을 예측하게 된다.

 

특잇값 분해를 적용하려면 행렬의 모든 값을 알아야 한다. 하지만 지금 행렬에는 미지항(사용자의 별점이 없는 영화)이 있다. 따라서 미지항을 임의의 값으로 초기화 하고 가중치 행렬을 적용해서 무시하게 만들거나, 아예 손실함수를 존재하는 별점 값에 대해서만 계산한다. 그리고 이미 값이 존재하는 항에 의한 과학습을 막기 위해 정규화를 이용한다.

 

6.5 표준화

표준화를 해야하는 이유는 다음과 같다.

1. 사용자에 따라 평균 별점 편차가 있다. 어떤 사용자는 다른 사용자에 비해 영화 점수를 후하게 주는 편이다. 한 사용자가 자신이 본 모든 영화에 별점 5를 주었다면 그 5점은 그다지 의미가 없다. 반대로 늘 점수를 짜게 주는 사용자가 어떤 영화에 별점 5를 주었다면 그 5점은 의미가 있다.
2. 영화에 따라서도 평균 별점 편차가 있다. 예를 들어 크리스마스에 개봉하는 영화는 별점을 더 잘 받는다거나, 속편의 경우에는 일반적으로 별점이 낮거나 하는 식처럼 말이다.

표준화는 이러한 외부 요인에 의한 편향을 줄여준다. 표준화를 하면 사용자 간의 유사도 및 사용자의 영화 선호도를 더 정확하게 평가할 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함