-
User Collaborative-Filtering (Cos Similarity)CS/Math 2021. 1. 25. 15:06
추천 시스템에 사용되는 Collaborative Filtering에 대해 정리합니다.
그중에서도 User Collaborative-Filtering에 중점을 뒀습니다.
최근에 출전한 공모전에서 적용해보려 알아본 것인데, 조건이 제한적이라 제대로 적용은 하지 못했습니다.
언젠간 추천 기능 구현을 위해 한 번쯤 고려해볼 만한 방법으로 정리하고 다시 공부해보기 위해 포스팅합니다.
Collaborative-Filtering (협업 필터링)
많은 유저들의 취향이나 정보를 수집(Collaborative)함으로써 어떤 유저의 취향을 자동으로 예측(Filtering)하는 방법론이다.
즉, 비슷한 관심사를 가진 사람들을 매칭하고 이를 기반으로 추천하는 방식입니다.
좀 더 자세히 써보면,
어떤 사람 'A'가 임의의 주제 'X'에 대해 어떤 사람 'B'와 같은 의견을 가진다면, 다른 주제 'Y'에 대해서 무작위로 선택된 다른 사람 'C'의 의견보다는 'B'와 같은 의견을 가질 가능성이 높다.라는 가정을 기반으로 합니다.
(10점 만점 기준)
TENET End-game Parasite Connect Kingdom A ? 8 10 5 4 B 9 7 x 6 5 C 5 3 2 x x 단적인 예로 위와 같은 표에서 A라는 사람에게 TENET을 추천해 줄 것인지, 즉 A가 TENET을 추천받았을 때 만족할지 알아보기 위해선 C라는 사람보단 더 많은 항목에서 유사한 의견을 갖는 B라는 사람의 성향을 기반으로 하는 것이 좋다는 의미입니다.
End-game, Connect, Kingdom에 대한 평가가 유사하죠.
이렇게, 아무런 관계없이 단순히 높은 투표수와 평점을 갖는 영화를 추천하는 것보단 개개인의 취향이 어느 정도 일치할 가능성이 있겠죠.
대충 어떤 방식인지 파악은 되는데, 그래도 정확하게 알아보는 것이 좋겠습니다.
Collaborative Filtering 동작 방식
- 사용자는 어떤 항목에 대한 자신의 선호도를 평가해 표현한다.
- 시스템에선 해당 사용자와 다른 사용자의 평가를 비교해 가장 취향이 유사한 사람들을 매칭 한다.
- 이후 해당 사용자가 아직 평가하지 않은 항목 중 사용자와 유사한 취향을 가진 사람들이 높게 평가한 항목을 추천한다.
또한, 이 방법은 일반적으로 3가지가 조건이 요구됩니다.
- 사용자의 적극적 참여가 필요. 즉, 방대한 데이터를 기반으로 하기 때문에 백지상태에선 실현하기 어렵습니다.
- 사용자의 관심사를 나타내는 쉬운 방법이 필요.
- 비슷한 관심사를 가진 사람끼리 매칭 할 알고리즘이 필요.
특히, 1번의 경우 추천을 받아야 할 사람이 평가한 정보가 적거나, 다른 사람들의 정보가 없다면 신뢰 높은 유사도를 계산하긴 어렵겠죠.
반대로 시간이 지남에 따라 많은 데이터가 쌓이면 그만큼 해당 사용자의 취향을 잘 예측할 가능성도 올라갈 것입니다.
Collaborative Filtering을 구현하는 방법은 여러 가지가 있는데, 그중 고려했던 방법인 Cos 유사도에 대해 소개합니다.
Cos-Similarity
Cos Similarity는 두 벡터 간 각도의 cos값을 이용하여 측정된 벡터 간의 유사한 정도를 의미한다. 코사인 유사도는 특히 결괏값이 [0,1]의 범위로 떨어지는 양수 공간에서 사용된다.
또한, 벡터의 크기는 이 결과에 영향을 주지 못합니다.
코사인 유사도가 어떻게 사용되는지에 대한 이해를 위해 간단한 예시를 들어보겠습니다.
유사함 -> 얼마나 가까운가?라고 볼 수도 있습니다. 가까운 정도는 Euclidean Distance로 표현하죠.
좌표 평면에 두 점이 존재하는 경우 두 점 사이의 거리는 아래와 같습니다.
즉, 2√5 만큼 가깝다 이야기할 수 있는데요. Euclidean Distance로 특정 관계의 유사도를 표현하기엔 한계가 있습니다.
아래와 같이 사람과 개의 성장 그래프를 표현하는 경우를 봅시다.
그래프의 최소 나이는 유아기이며, 최대 나이는 성인이 되어 성장이 멈추는 시기로 가정하겠습니다.
대략적으로 표현하기 위해 표를 약간은 극단적으로 그렸습니다.
실질적인 의미보단 다양한 경우를 일반적으로 보여드리기 위한 예시라고 생각해주세요.
어찌 됐든 이러한 경우 각 개체별 그래프 형상을 잘 보시면 이상한 점이 보입니다.
H - D의 유클리드 거리와 H - H'의 유클리드 거리를 보면 H - D < H' - H입니다.
즉, H와 H'이 같은 개체임에도 불구하고 유클리드 거리로 유사도를 계산한다면 H와 D가 더 유사한 개체라고 인식할 수 있다는 점이죠.
따라서, 이러한 문제점을 보완하는 것이 Cos-Similarity입니다.
코사인 값을 기준으로 정해지는 결과이므로 식의 결과는 1 ~ -1까지 존재합니다.
내적 공식으로 유도할 수 있습니다.
(1, 0, -1)에 대한 각은 이와 같이 그려 냈을 때 아래의 의미를 갖습니다.
- A - B의 경우 사잇각이 0, 결과는 1이며 이때는 A와 B가 동일한 경우입니다.
- A - B'의 경우 사잇각이 90, 결과는 0이며 이때는 A와 B가 독립적, 서로 관련 없는 경우입니다.
- A - B''의 경우 사잇각이 180, 결과는 -1이며 이때는 A와 B가 반대인 경우입니다.
즉, 서로의 벡터가 겹쳐진 1(A - B)로 갈수록 높은 유사도를 보이겠죠.
각 요소에 대한 사잇각을 알 수 있다면 간단하겠지만, 일상생활에선 그러한 각이 존재하지 않습니다.
그러면 다른 식을 사용해야겠죠..?
조금은 머리가 아프겠네요 ^^;예시로 사용했던 표를 다시 가져와보면, A라는 사람과 B라는 사람의 영화 선호도에 대한 사잇각을 전혀 찾아볼 수 없죠.
TENET End-game Parasite Connect Kingdom A ? 8 10 5 4 B 9 7 x 6 5 C 5 3 2 x x 따라서, 이러한 경우엔 파생되어있는 식을 활용합니다.
음.. 이지한 고등학교 수학이네요 ^^우리는 아래의 식으로 간단히 A, B 그리고 A, C의 유사도를 계산해보겠습니다.
식에 대해서 간략히 설명하면, 분모의 A_i와 B_i는 각 A가 평가한 영화와 B가 평가한 영화의 점수를 의미합니다.
즉, 루트 내의 각 계산식을 풀어보면 아래와 같습니다.
사용자가 평가하지 않은 항목은 제외하고 계산합니다.
= rate(End-game)^2 + rate(Parasite)^2 + rate(Connect)^2 + rate(Kingdom)^2
= 64 + 100 + 25 + 16 = 205
- rate(X): 항목 X에 대한 사용자의 평가 점수
= rate(TENET)^2 + rate(End-game)^2 + rate(Connect)^2 + rate(Kingdom)^2
= 81 + 49 + 36 + 25 = 191이렇게 계산할 수 있고, 분자는 A_i와 B_i 중 공통 i를 통해 곱해주는 것을 볼 수 있습니다.
즉, 두 사람 모두 평가한 영화에 대한 계산식입니다. 따라서, 아래와 같이 표현 가능합니다.
= rate(End-game_A) x rate(End-game_B) + rate(Connect_A) x rate(Connect_B) +
rate(Kingdom_A) x rate(Kingdom_B)
= 56 + 30 + 20 = 106similarity(A, B) = 0.536이며, 같은 방식으로 A, C도 진행합니다.
similarity(A, C) = 0.499
초기 설명드렸다시피 A - C 보단 A - B의 유사도가 더 높게 나타났습니다.
즉, 해당 데이터만 봤을 때, B의 의견에 따라 A에게 영화 추천 여부가 결정될 확률이 높습니다.
결론적으로 Cos-Similarity는 아래와 같은 상황에서 유용하게 사용됩니다.
더보기예를 들어 N은 10점 만점에 모든 항목에 대한 평가를 1 ~ 5점을 M은 1 ~ 10점 사이를 준다고 가정하겠습니다.
그리고 그들이 X, Y, Z에 대한 평가를 아래와 같이 한 경우
X Y Z
N 5 2 4
M 10 4 8서로 다른 취향을 가진 사용자일까요? 벡터로 그려봅시다.
similarity(N, M) = 1로 동일하다 표현됩니다.
즉, 보시는 바와 같이 벡터의 크기와 상관없이 유사도를 계산하는 경우 유용하게 사용됩니다.
아래는 Wikipedia에서 발췌한 내용입니다.
흔히 다차원의 양수 공간에서의 유사도 측정에 자주 이용된다. 예를 들어 정보 검색 및 텍스트 마이닝 분야에서, 단어 하나 하나는 각각의 차원을 구성하고 문서는 각 단어가 문서에 나타나는 회수로 표현되는 벡터값을 가진다. 이러한 다차원 공간에서 코사인 유사도는 두 문서의 유사를 측정하는 매우 유용한 방법이다.
이렇게 간략하게 개념과 사용 방식에 대해 알아봤습니다.
유사한 공식을 갖는 피어슨 상관계수(양적인 두 변수 간의 관계가 유의한 지)도 있습니다. 링크를 통해 참고하시기 바랍니다.
당연한 이야기겠지만 유사도 자체의 정확도는 데이터가 많으면 많을수록 좋아집니다.
현재 의도하려는 추천 시스템이 과연 Cos-Similarity에 적합한지 잘 분석한 후 사용하시기 바랍니다.
Python sklearn 라이브러리는 해당 함수를 구현해 두었네요. 이 또한 아래 링크로 첨부합니다.
의문점이나 질문에 대한 내용을 남겨주시면 늦지 않게 피드백하겠습니다. 감사합니다.
참고 자료
Wikipedia - Pearson Correlation Coefficient, PCC (Korean)
Wikipedia - Euclidean Distance
Wikipedia - Cos Similarity (Korean)
Wikipedia - Collaborative Filtering
Github - sklearn (cosine_similarity)
자문
고려대 인공지능 대학원 PRML LAB 김성진
반응형'CS > Math' 카테고리의 다른 글
1. Vector(3) (0) 2018.11.26 1. Vector(2) (0) 2018.11.23 1. Vector(1) (0) 2018.11.23