Collaborative Filtering
C / C++2009. 1. 19. 12:50
Collaborative Filtering
유사한 취향을 가진 사람들의 작은 집합을 만드는 것. 일종의 클러스터링.
관련 논문으로 "Using collaborative filtering to weave an information tapestry" 이 있음.
유사한 취향을 가진 사람들의 작은 집합을 만드는 것. 일종의 클러스터링.
관련 논문으로 "Using collaborative filtering to weave an information tapestry" 이 있음.
- Similarity score 계산
사람(혹은 아이템) 간의 취향이 얼마나 비슷한지 정도를 계산할 수 있는데, 아래의 방법들이 있음 - Euclidean distance score
각각의 항목들을 축으로 놓고 특정 사람에 대한 항목별 선호도를 점으로 표시하면 두사람간의 거리를 계산하여 유사도를 구할 수 있는데 이를 유클리디안 거리점수 라고 한다. 항목이 두개 (x, y)인 경우 두 사람 A(x1, y1), B(x2, y2) 간의 거리는 y = sqrt( (x1 - x2)^2 + (y1 - y2)^2 ) 이다. 마찬가지로 n 개의 항목에 대한 유클리디안 거리점수를 계산하면 아래처럼 표시될 수 있다.
y = sqrt( (a1 - a2)^2 + ... + (n1 - n2)^2 )
일반적으로 이렇게 구한 거리 d 를 1/d식으로 활용하여 서로 유사할 수록 높은 점수를 주는 방식으로 사용한다. - Pearson correlation score
두개의 데이처 집합이 한 직선으로 잘 표현되는 정도를 나타낸 것이 상관계수인데, 정규화되지 않은 데이터에 대해 좋은 결과를 제공한다. 각각의 값이 점으로 표시된 좌표에서 모든 점들과 가장 가까운 직선을 그릴 수 있는데 이를 최적맞춤선(best-fit line)이라고 한다. 여러 항목들에 대한 두사람의 선호도 데이터를 가지고 있다면 이 두사람을 각 좌표의 축에 놓고 best-fit line을 그릴 수 있다.
이 직선을 통해서 대체적으로 누가 더 많은 점수를 주었는지를 파악할 수도 있는데, 이를 grade inflation이라고 한다. 한쪽이 더 높은 점수를 꾸준하게 주었어도 선호도가 비슷하다면 직선으로 잘 표현될 수도 있다.
때문에 Euclidean distance에서는 한쪽이 전체적으로 낮은 점수를 주었으면 두 사람의 유사도가 낮게 나오는 반면 Pearson correlation score에서는 이를 유사한 것으로 뽑아낼 수 있다.
아래의 두 사람의 데이터에 대한 Pearson correlation score를 뽑아낸다고 하면,
m1[] = { a1, a2, ... , an}
m2[] = { b1, b2, ... , bn}
아래와 같은 식으로 상관계수 값을 도출할 수 있다.
sum1 = a1 + ... + an
sum2 = b1 + ... + bn
sq_sum1 = a1^2 + ... + an^2
sq_sum2 = b1^2 + ... + bn^2
mul_sum = a1 * b1 + ... + an * bn
v1 = mul_sum - (sum1 * sum2 / n)
v2 = sqrt( (sq_sum1 - (sum1^2) / n) * (sq_sum2 - (sum^2) / n) )
return v2 == 0 ? 0 : n / v2
값은 -1 ~ 1 사이이고 1은 모든 항목에 같은 점수를 준 것이다.
'C / C++' 카테고리의 다른 글
[C/C++] template를 이용한 singleton 패턴 사용. (2) | 2009.12.24 |
---|---|
C++에서 XML 파일 읽기 (0) | 2008.09.09 |
libcmtd.lib LNK2005 - 중복 선언 에러 (0) | 2008.05.09 |
C++ 클래스 안에서 쓰레드를 생성해 쓰기 (0) | 2008.02.28 |