사람들의 관심사이의 유사성을 판단하는 조금 더 정교한 방법은 피어슨 상관 계수를 사용하는 것이다. 상관 계수는 두 데이터 세트가 일직선상에 얼마나 잘 들어맞는가를 측정하는 것이다. 이에 대한 공식은 유클리드 거리 점수보다 더 복잡하지만, 예를 들어 평론가들의 영화 순위가 일상적으로 평균보다 더 가혹할 경우 데이터가 잘 정규화되지 않는 상황에서 더 나은 결과를 제공하는 경향이 있다.


이 방법을 시각화하기 위해 그림 2-2와 같이 평론가 2명의 등급을 도표에 표시할 수 있다. 슈퍼맨은 믹 라살(Mick LaSalle)이 3점, 진 시무어가 5점을 받아 차트(3,5)에 올려졌다.


차트에서도 일직선을 볼 수 있다. 이것은 차트의 모든 항목에 가능한 한 근접해 있기 때문에 베스트핏 라인이라고 불린다. 두 평론가들이 매 영화마다 같은 등급을 받는다면, 이 선은 대각선으로 차트의 모든 항목을 만질 것이며, 완벽한 상관성 점수는 1점일 것이다. 이 사례에서, 비평가들은 몇 편의 영화에 대해 의견이 다르기 때문에, 상관 점수는 약 0.4점이다. 그림 2-3은 약 0.75 중 하나인 훨씬 더 높은 상관관계의 예를 보여준다.


그림에서 볼 수 있는 피어슨 점수를 사용할 때 한가지 흥미로운 점은 그것이 등급 인플레이션을 수정한다는 것이다. 이 그림에서 잭 매튜스는 리사 로즈보다 더 높은 점수를 주는 경향이 있지만, 비교적 비슷한 선호도를 가지고 있기 때문에 그 선은 여전히 들어맞는다. 한 비평가가 다른 비평가보다 더 높은 점수를 주는 경향이 있다면, 그들의 점수의 차이가 일관된다면 완벽한 상관관계가 있을 수 있다. 앞에서 서술한 유클리드 거리 점수는 비록 그들의 취향이 매우 비슷할지라도 한 비평가가 다른 비평가들보다 지속적으로 가혹하기 때문에 두 비평가는 서로 다르다고 말할 것이다. 당신의 특정 용도에 따라, 이 행동은 당신이 원하는 것일 수도 있고 아닐 수도 있다.


Pearson 상관 점수의 코드는 먼저 두 평론가들에 의해 평가된 항목을 찾아낸다. 그런 다음 두 비평가의 평점 제곱합과 평점 제곱합을 계산하고, 평점 산물의 합계를 계산한다. 마지막으로, 아래 코드에 굵은 글씨로 표시된 Pearson 상관 계수를 계산하기 위해 이러한 결과를 사용한다. 거리 측정과 달리 이 공식은 매우 직관적이지는 않지만, 변수가 얼마나 개별적으로 변화하는지 곱으로 나눈 값들을 알려준다.


이 공식을 사용하려면 권장 사항에서 sim_ 거리 함수와 동일한 서명으로 새 함수를 생성하자.


# Returns the Pearson correlation coefficient for p1 and p2

def sim_pearson(prefs,p1,p2):

 # Get the list of mutually rated items

 si={}

 for item in prefs[p1]:

 if item in prefs[p2]: si[item]=1

 # Find the number of elements

 n=len(si)

 # if they are no ratings in common, return 0

 if n==0: return 0

 # Add up all the preferences

 sum1=sum([prefs[p1][it] for it in si])

 sum2=sum([prefs[p2][it] for it in si])

 # Sum up the squares

 sum1Sq=sum([pow(prefs[p1][it],2) for it in si])

 sum2Sq=sum([pow(prefs[p2][it],2) for it in si])

 # Sum up the products

 pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si])

 # Calculate Pearson score

 num=pSum-(sum1*sum2/n)

 den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))

 if den==0: return 0

 r=num/den

 return r


이 기능은 ?1과 1 사이의 값을 반환한다. 값이 1이라는 것은 두 사람이 모든 항목에 대해 정확히 같은 등급을 갖고 있다는 것을 의미한다. 거리 메트릭과 달리 이 값을 올바른 척도로 가져오기 위해 변경할 필요는 없다. 이제 그림 2-3의 상관 관계 점수를 받아 보자.


>>> reload(recommendations)

>>> print recommendations.sim_pearson(recommendations.critics,

... 'Lisa Rose','Gene Seymour')

0.396059017191


어떤 유사성 메트릭을 사용해야 하는가?

나는 여기서 두 가지 다른 메트릭스에 대한 기능을 도입했지만, 사실 두 데이터 세트 사이의 유사성을 측정하는 방법은 더 많다. 사용하기에 가장 좋은 것은 당신의 용도에 달려 있으며, 당신이 생각하는 더 나은 결과를 얻기 위해 피어슨, 유클리드 거리 또는 다른 사람들에게 시도해 볼 가치가 있다.


이 장의 나머지 기능에는 선택적 유사성 매개변수가 있는데, 이 매개변수는 실험하기 쉽게 하기 위한 함수를 가리킨다. sim_pearson 또는 sim_ 벡터를 지정하여 사용할 유사성 매개변수를 선택한다. 자카드 계수나 맨해튼 거리 등 다른 많은 기능들이 있는데, 그것들이 동일한 서명을 가지고 있고 더 높은 값이 더 유사하다는 것을 의미하는 곳에 플로트를 반환하는 한 당신은 유사함수로 사용할 수 있다.


 http://en.wikipedia.org/wiki/ Metric_%28mathetics%29#Examples에서 항목을 비교하기 위한 다른 메트릭에 대해 읽을 수 있다.


평론가 순위 지정

이제 두 사람을 비교하는 기능을 갖게 되었으니, 모든 사람에게 주어진 사람을 상대로 점수를 매기고 가장 가까운 일치점을 찾아내는 기능을 만들 수 있다. 이 경우, 나는 영화를 결정할 때 누구의 충고를 들어야 하는지 알기 위해 어떤 영화 평론가들이 내 취향에 맞는 것을 배우는 데 관심이 있다.  recommendations.py에 이 기능을 추가하여 특정 사람과 유사한 취향을 가진 사용자 목록을 주문하자.


# Returns the best matches for person from the prefs dictionary.

# Number of results and similarity function are optional params.

def topMatches(prefs,person,n=5,similarity=sim_pearson):

 scores=[(similarity(prefs,person,other),other)

 for other in prefs if other!=person]

 # Sort the list so the highest scores appear at the top

 scores.sort( )

 scores.reverse( )

 return scores[0:n]


이 함수는 이전에 정의된 거리 측정지표 중 하나를 사용하여 사전의 다른 모든 사용자와 나를 비교하기 위해 파이썬 목록 이해를 사용한다. 그런 다음 정렬된 결과의 첫 번째 n개 항목을 반환한다.


이 기능을 내 이름으로 부르는 것은 나에게 영화 평론가들의 목록과 그들의 유사점 점수를 준다.


>> reload(recommendations)

>> recommendations.topMatches(recommendations.critics,'Toby',n=3)

[(0.99124070716192991, 'Lisa Rose'), (0.92447345164190486, 'Mick LaSalle'),

 (0.89340514744156474, 'Claudia Puig')]


이것으로부터 나는 리사 로즈의 취향이 나와 비슷한 경향이 있기 때문에 그녀의 리뷰를 읽어야 한다는 것을 안다. 만약 여러분이 이 영화들 중 어떤 것을 본 적이 있다면, 여러분은 자신의 선호도를 가진 사전에 자신을 추가시켜보고 여러분이 가장 좋아하는 비평가가 누구인지 볼 수 있다.



  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기