Thursday, August 28, 2008

Collaborative Filtering

Collaborative Filtering

유사한 취향을 가진 사람들의 작은 집합을 만드는 것. 일종의 클러스터링.

관련 논문으로 "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은 모든 항목에 같은 점수를 준 것이다.

No comments:

Post a Comment