Showing posts with label Collective Intelligence. Show all posts
Showing posts with label Collective Intelligence. Show all posts

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은 모든 항목에 같은 점수를 준 것이다.