jm_p_op
협업필터링(비슷한 사람 구하기) 본문
사람 | 취향1 | 취향2 | 취향3 |
A | 4 | 2 | 0 |
B | 2 | 1 | 0 |
C | 0 | 0 | 3 |
취향에 따라 벡터로 생각을 하자 A,B의 단위벡터는 같음으로 두 취향은 비슷하다고 할수 있다.
B,C를 보았을때 수직으로 전혀 겹치지 않는다.
두 벡터의 각이 작을수록 유사하다
=> 코사인 유사도
=> 이는 내적값이 작을수록 유사하다
=> a * b =(a1,a2,a3)*(b1,b2,b3)/|(a1,a2,a3)| * |(b1,b2,b3)|
= (a1Xb1)+(a2Xb2)+(a3Xb3) / [(a1^2+a2^2+a3^2)X(b1^2+b2^2+b3^2)]
A | B | C | |
A | 1 | 1 | 0 |
B | 1 | 1 | 0 |
C | 0 | 0 | 1 |
극단적인 케이스지만 한 사람마다 코사인 유사도의 랭킹을 통해 비슷한 사람을 찾을수 있다.
개선방법
사람과 사람사이의 관계도를 계산해야되므로 n^2으로 처리해야된다.
1. 계산량을 줄인다면 기준축을 잡고 그 축을 잡은후 그 축으로 비슷한 사람을 나누면 된다. ex) (0,1,1),(0,0,1) 2개축으로 나누기
2. 혹은 군집화를 통한 유사한 사람을 구하기
예전 데이터를 희석 시키는 방법
예전 데이터를 0.9배 하고 신규 데이터를 더해준다.=>(43번 반복시 0.01정도가 된다.)
사용방법 - twitter처럼 랜덤한 게시글과 유사한 사람의 게시글을 여러개 뽑고, 필터를 통해 개시글을 추천해줄수 있다.