관리 메뉴

HAMA 블로그

집단지성프로그래밍 (2) 본문

통계 & 머신러닝 & 딥러닝

집단지성프로그래밍 (2)

[하마] 이승현 (wowlsh93@gmail.com) 2015. 5. 27. 15:21


집단 지성 프로그래밍이라는 책을 정리해본다.  (http://www.yes24.com/24/goods/2917663?scode=032&OzSrank=1) 

이 책은 머신러닝의 기본이되는 내용을 훌륭히 소개하고 있는 꽤 유명한 책이다. 각 챕터의 핵심만 정리한다. 


순서 

1. 집단지성 소개

2. 추천시스템 만들기

3. 군집발견

4. 검색과 랭킹

5. 최적화

6. 문서필터링

7. 의사결정트리

8. 가격 모델링

9. 고급분류기법 : 커널기법과 SVM

10. 독립특성 발견 

11. 진화지성

12. 알고리즘 요약  




1. 협업 필터링 

괜찮은 영화를 선택할때 , 보통 주변 친구들한테 물어보는 방법을 사용하기도 한다.

협업 필터링 알고리즘은 큰 무리의 사람들을 검색해서  나와 비슷한  취향의 작은 집합을 발견한후에  

그 집합에서의 선택을 결합해서 목록을 만든다 

처음에 협업필터링은 제록스의 데이비드 골드버그가  문서에 흥미있음 또는 흥미없음이라는 주석을 달도록해서 

다른사람이 문서를 검색할때 필터링에 이용되도록 하는 논문에서 처음 사용됬다. 


2. 선호 정보 수집  

파이썬을 이용하여 정보를 수집해보자.  중첩 딕셔너리를 사용하는데 다음과 같다.

critics = { 'Lisa Rose' : {'Lady in the water' : 2.5, 'Superman Returns' : 3.5},

               'Gene Seymour' : {'Lady in the water' : 1.5, 'Superman Returns' : 3.0},

               ....}


 평론가별 영화 평가 목록이다. 

비슷하게 쇼핑싸이트 경우는 구매한경우 1, 그렇지 않은경우 0 을 사용할수도있고, 

뉴스기사에 -1 싫어함, 0 모름 , 1 좋아함으로 평가할수도있다.


3. 유사 사용자 찾기  

- 유클리디안 거리점수

    : sqrt (pow (3.5 - 3.0 , 2) + pow (2.5 - 1.5, 2) ) ; 

      위의 선호정보수집에서 두 평론가 사이의 유사성은 이렇게 거리를 계산하여 찾을수있다.

- 피어슨 상관점수 

    유킬리디안 거리점수의 문제는 두 평론가의 영화 취향에 대한 유사성이 비슷한데 , 

    한사람은 굉장히 짜서 만약 3가지 영화에 대해서 1,2,3 이렇게 점수를 매기고  

    다른사람은 점수를 후하게 주어서  3,4,5 이렇게 줬다고하자. 두명은 사실 취향이 비슷한건데

    유킬리디안식으로 하면 2씩의 거리차이가 난다. 따라서 피어슨 상관점수는 이럴경우 더 잘맞는 공식이다.

    최적 맛춤선 ( best - fit line) 이 유사한 선호도를 가진 사람끼리는 한 직선으로 잘 표현된다.   

- 유사도 측정 지표 선택 방법 

   위의 2가지 말고도 다양한 유사도 측정 방법이 많다. 함수에 옵션으로 선택하게 할수있다.


위와 같이 유사사용자를 찾기위해서는 먼저  항목을 수치화 하는게 중요하다는것을 알수있다. 


4. 항목 추천  

 위의 유사사용자찾기에서 나와 취향이 비슷한 평론가를 찾은후에 그 사람이 높게 평가한 영화중 내가 안본 영화를 찾는것이 가장  손쉬운 선택이지만, 이건 너무 관대한 판단이다.  다음 방법을 사용해보자

# 다른 사람과의 순위의 가중 평균값을 이용해서 특정 사람에 추천 

def getRecommendations(prefs,person,similarity=sim_pearson):

  totals={}

  simSums={}

  for other in prefs:

    # 나 자신과 비교하지 말것 

    if other==person: continue

    sim=similarity(prefs,person,other)


    # 0 이하의 점수는 무시 

    if sim<=0: continue

    for item in prefs[other]:

   

      # 내가 보지 못한 영화만 대상 

      if item not in prefs[person] or prefs[person][item]==0:

        #  유사도 * 점수 

        totals.setdefault(item,0)

        totals[item]+=prefs[other][item]*sim

        # 유사도 합계 

        simSums.setdefault(item,0)

        simSums[item]+=sim


  # 정규화된 목록 생성 

  rankings=[(total/simSums[item],item) for item,total in totals.items()]


  # 정렬 목록 리턴 

  rankings.sort()

  rankings.reverse()

  return rankings


5. 제품 매칭   

 지금까지 유사한 사람을 찾는 방법 과 한 사람에게 영화를  추천하는 방법을 보았다. 이제는 한 제품과 다른 제품이 얼마나 비슷한지 살펴보자. 이런 기능은 쇼핑 웹 싸이트에서 자주 방문하지 않은 사람들에게 제공한다. 


6. 딜리셔스 링크 추천 기능 만들기 

 이절에서는 가장 인기있는 온라인 북마크 싸이트 중의 하나로부터 데이터를 추출하는 방법과 이 데이터를 활용해서 비슷한 사람  찾기 그리고 전에 본 적이 없는 링크를 추천하는 방법을 소개한다. 

 - 딜리셔스 API

 - 데이터 구축 

 - 이웃과 링크 추천 


7. 항목 기반 필터링 

 이제까지는 모든 사용자들이 평가한 랭킹 정보 데이터가 있어야 추천 엔진을 구현할수있었다. 이는 수천명의 사람이나 항목이 있을땐 잘 작동할것이다. 하지만 아마존과 같은 매우 큰 사이트의 경우에는 수백만의 고객과 제품이 있어 한 명을 다른 모든 사용자와 비교하고 각 사용자가 평가한 모든 제품과 비교하는 작업은 매우 느리게 동작할것이다. 또 수백만가지의 제품을 가진 싸이트에서는 사람간의 중첩이 거의 없어 유사한지 결정하기 까다롭다.

이제까지 사용한 방법은 " 사용자 기반 협력 필터링 (user-based collaborative filtering) " 이고 

이제부터는 "항목 기반 협력 필터링 ( item -based collaborative filltering) "을 살펴보자.  매우 큰 데이터셋을 다룬다면 이게 더 좋은 결과를 나타낼것이다.


- 항목 비교 데이터 세트 생성 

- 추천 생성 


8. 무비렌즈 데이터 세트 이용하기  

 

9. 사용자 기반 필터링과 항목 기반 필터링 

사용자 기반 필터링 기법은 구현하기 용이하고 추가 단계가 없어, 자주 변경되는 보다 작은 메인  메모리안에 들어가는 데이터 세트에 적당하다.  



... 작성중 ...

 

Comments