개발 및 연구 정보

Pearson Correlation in Map/Reduce

바보천사 2012. 10. 24. 17:59

Mahout 에 있는 CF의 피어슨 상관계수 계산이 이상하고...

또, 사용자 기반 CF의 M/R 설명은 없는 듯 해서...


직접 구현하려고 찾다가 본 정보

http://vangjee.wordpress.com/2012/02/29/computing-pearson-correlation-using-hadoops-mapreduce-mr-paradigm/


여기 보면, 꽤 자세히 설명이 나와 있고,

또 중간에 보면..피어슨 상관 계수 계산 수식 링크가 있는데...

http://davidmlane.com/hyperstat/A51911.html


일반적으로 평균을 이용해서 계산하면, 데이터 두번 스캔(O(n2))이 필요한데..

이건, 한번 스캔(O(n))으로 끝난다...(멘붕..ㅡㅡ;..여태까지 왜 이걸 몰랐는지..)


여튼, 이 사이트에서 아이디어를 얻어서...피어슨 상관 계수를 M/R로 구현중.....

사실상, 피어슨 상관 계수만 구해지면,...CF의 M/R 구현은 끝났다고 봐도 되는거지..ㅎㅎ..

(앞에 포스팅한, CF M/R 예제 설명은...이해하기가 넘 힘들다...)

(그래서, 피어슨 상관계수를 M/R로 직접 해보기로..결정..ㅡㅡ;..)

(수학에 대한 얕은 지식과 무지한 해석능력에 대해 뼈저린 아픔을..ㅡㅡ;..)

문제는....과연, 효율적..즉, 빠를 것인가 하는 문제...


로직은...

로우 파일 = (사용자, 아이템, 점수) 일때,

=> 아이템을 키로, (사용자:점수) 리스트로 변환

=> (사용자-i, 사용자-j)를 키로, (공유 아이템에 대한 사용자-i의 점수, 사용자-j의 점수)를 밸류로 분해

=> (사용자-i, 사용자-j)를 키로, 리스트 모아서 계산하면, 끝


** 참고로, M/R 사용자 정의 writable을 쓸 경우....comparable 클래스를 같이 만들어야만 한다....

아니면, writable 클래스에, hash 및 compare 함수 등을 추가 해 주거나....

(어쩐지..너무 간단하게 된다 했는데..ㅎㅎ...한참 해맸음..)

Reduce의 output으로만 사용될 경우는 상관 없으나

Map의 output/Reduce의 input의 key로 쓰기 위함이라면...compare 가 필요해서 그렇단다..