jm_p_op

협업필터링(비슷한 사람 구하기) 본문

카테고리 없음

협업필터링(비슷한 사람 구하기)

jm_p_op 2023. 6. 1. 00:49
사람 취향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정도가 된다.)

 

https://github.com/jmpop97/DaechineLearning/blob/7e978467fd85085de9c0ce1766e05c3bd37b75b1/users/views.py#L68


사용방법 - twitter처럼 랜덤한 게시글과 유사한 사람의 게시글을 여러개 뽑고, 필터를 통해 개시글을 추천해줄수 있다.