인프런 커뮤니티 질문&답변
cosine similarity에 대한 질문이 있습니다.
해결된 질문
작성
·
759
0
협업 필터링에서 cosine similarity를 구할 때 아래와 같은 행렬을 내적곱을 통해 구하는 것으로 알고 있습니다.

이제 위는 영화(아이템)간의 유사도가 나올텐데,
왜 행이 영화(아이템)이 되고 열(유저 id)가 되는지 궁금합니다.
그리고 내부적으로 어떻게 연산이 되어서 유사도가 나오는건지 이해가 잘 안됩니다.
답변 주시면 감사하겠습니다.
답변 1
1
안녕하십니까,
코사인 유사도(Cosine Similarity)는 2개의 데이터간의 유사도를 나타낼때 개별 데이터를 벡터화 한 뒤 이들 사이의 방향성을 Cosine값으로 치환하여 나타냅니다.
코사인 유사도를 위해서는 개별 데이터들의 feature들을 벡터로 표시한 뒤 이 벡터간의 방향성이 얼마나 유사한지 나타내는데, 만일 두 데이터 A와 B가 있을 때 두 벡터의 사이각이 0도 이면 Cosine 0 은 1이 되고, 동일한 데이터로 간주하며, 사이각이 90도 이면 서로 엇갈리는 방향성이므로 Cosine 90도는 0 이 되어 서로 전혀 유사하지 않은 것으로 간주합니다.
코사인 유사도에 대한 설명은 텍스트 분석 섹션의 '문서 유사도 개요와 코사인 유사도 소개' 동영상을 참조 부탁드립니다. 해당 동영상에 사이킷런의 cosine_similarity() 함수에 대한 설명도 있습니다. 이 cosine_simialarity() 함수는 두개의 데이터를 확장해서 여러개의 데이터를 행렬로 입력 받아 pairwise 형태로 코사인 유사도를 반환합니다. 해당 동영상을 다시 리뷰해보시면 이해에 도움이 되실 것입니다.
그리고 아이템 기반 협업 필터링을 위해 행이 영화(아이템), 열이 사용자 아이디, 값이 평점 데이터인 행렬을 만들었습니다. 이렇게 만든 이유는 영화의 속성들을 개별 사용자가 평가한 평점으로 만들기 위함입니다. 사용자가 백만명이라고 한다면 이제 개별 영화는 사용자 1, 2, 3,4 .... 백만명의 사용자 속성(컬럼/피처)들을 가지게 되고, 개별 영화를 규정짓는것은 이 사용자들의 평점 정보인 것입니다.
즉 어떤 영화 A와 B가 있다면, 이 영화가 비슷한지를 가늠하는 척도는 1 ~ 백만명의 사용자(백만개 속성)이 평가한 평점들이 얼마나 유사한지에 따라 결정되며, 이를 편리하게 추출하는 방식이 바로 사이킷런의 cosine_similarity() 함수 입니다. 이 cosine_similarity()의 입력 인자 행렬을 만들기 위해서 행이 영화, 열이 사용자 아이디 형태의 DataFrame을 생성한 것입니다.
감사합니다.





