코사인 유사도
코사인 유사도 (Cosine Similarity)
코사인 유사도(Cosine Similarity)는 두 개의 비영벡터(Non-zero vectors)가 얼마나 유사한지를 측정하는 지표입니다. 이 방법은 벡터의 방향(각도)에 초점을 맞추며, 벡터의 크기(길이)는 고려하지 않습니다. 주로 자연어 처리(NLP), 텍스트 마이닝, 추천 시스템 등 고차원 데이터 공간에서 문서나 항목 간의 유사성을 계산하는 데 널리 사용됩니다.
1. 개요 및 기본 개념
코사인 유사도는 기하학적으로 두 벡터 사이의 코사인 각도(cosine angle)를 의미합니다. 두 벡터가 완전히 동일한 방향을 가리키면 유사도 값은 1이 되고, 서로 수직(직교)이면 0, 정반대 방향이면 -1이 됩니다. 일반적으로 텍스트 데이터에서는 빈도 벡터가 음의 값을 가지지 않으므로, 유사도 범위는 보통 [0, 1] 사이로 해석됩니다.
핵심 특징
- 방향성 기반: 벡터의 절대적인 크기(예: 문서의 길이)에 영향을 받지 않습니다. 즉, 길이가 긴 문서와 짧은 문서라도 내용이 유사하면 높은 유사도 점수를 부여합니다.
- 비교 대상: 주로 TF-IDF(Term Frequency-Inverse Document Frequency) 벡터나 Word Embedding(Word2Vec, BERT 등) 벡터에 적용됩니다.
2. 수학적 정의
두 벡터 $A$와 $B$ 사이의 코사인 유사도는 다음과 같이 정의됩니다.
$$ \text{Cosine Similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}} $$
여기서 각 항의 의미는 다음과 같습니다: * $A \cdot B$: 벡터 $A$와 $B$의 내적(Dot Product) * $\|A\|$: 벡터 $A$의 유클리드 노름(Euclidean Norm, 즉 벡터의 길이) * $\|B\|$: 벡터 $B$의 유클리드 노름 * $n$: 벡터의 차원 수 (예: 사전의 어휘 크기)
해석
- 1: 두 벡터가 완전히 동일함 (각도 0도)
- 0: 두 벡터가 서로 독립적임 (각도 90도)
- -1: 두 벡터가 정반대 방향임 (각도 180도)
3. 주요 적용 분야
3.1 문서 유사도 측정
문서를 단어의 빈도로 표현한 벡터(BoW, Bag of Words)나 TF-IDF 벡터로 변환한 후, 문서 간의 내용을 비교합니다. 문서의 길이가 달라도 내용적 유사성을 파악할 수 있어 검색 엔진의 핵심 알고리즘으로 활용됩니다.
3.2 추천 시스템
사용자의 선호도 벡터와 아이템(상품, 영화 등)의 특성 벡터 간의 코사인 유사도를 계산하여, 사용자가 좋아할 만한 아이템을 추천합니다. 협업 필터링(Collaborative Filtering)이나 콘텐츠 기반 필터링(Content-based Filtering)에서 빈번하게 사용됩니다.
3.3 클러스터링 및 군집화
K-Means와 같은 클러스터링 알고리즘에서 거리 측정 기준으로 유클리드 거리 대신 코사인 거리를 사용할 수 있습니다. 특히 텍스트 데이터와 같이 고차원이고 희소한(Sparse) 데이터에서 더 효과적인 군집화를 가능하게 합니다.
4. 유클리드 거리와의 비교
| 특징 | 코사인 유사도 (Cosine Similarity) | 유클리드 거리 (Euclidean Distance) |
|---|---|---|
| 측정 대상 | 벡터의 방향 (각도) | 벡터의 위치 (직선 거리) |
| 크기 영향 | 벡터의 크기에 무관함 | 벡터의 크기에 민감함 |
| 적합한 데이터 | 고차원, 희소 데이터 (텍스트 등) | 저차원, 밀집 데이터 (이미지, 좌표 등) |
| 주요 용도 | 문서 검색, 텍스트 마이닝 | 공간적 근접성 분석, 이미지 매칭 |
5. 구현 예시 (Python)
Python의 [scikit-learn](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC/scikit-learn) 라이브러리를 사용하여 코사인 유사도를 계산하는 예시입니다.
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 예시: 두 개의 문서 벡터 (TF-IDF 결과 가정)
# 문서 1: [0.1, 0.2, 0.0, 0.5]
# 문서 2: [0.1, 0.1, 0.0, 0.4]
vector_A = np.array([[0.1, 0.2, 0.0, 0.5]])
vector_B = np.array([[0.1, 0.1, 0.0, 0.4]])
# 코사인 유사도 계산
similarity = cosine_similarity(vector_A, vector_B)
print(f"코사인 유사도: {similarity[0][0]:.4f}")
6. 한계점 및 주의사항
- 희소성 문제: 고차원 공간에서 벡터가 희소할 경우, 코사인 유사도가 모든 쌍에 대해 0에 가까워져 구별력이 떨어질 수 있습니다.
- 방향성 무시: 벡터의 크기 정보가 중요한 경우(예: 구매 횟수, 조회수 등 절대적 수치)에는 적합하지 않을 수 있습니다. 이 경우 유클리드 거리나 피어슨 상관계수를 고려해야 합니다.
- 음수 값 처리: 텍스트 데이터에서는 일반적으로 음수가 발생하지 않지만, 일반 벡터의 경우 음수 유사도가 발생할 수 있어 해석 시 주의가 필요합니다.
7. 관련 문서 및 참고 자료
- [자연어 처리(NLP)]
- [TF-IDF]
- [워드 임베딩(Word Embedding)]
- [추천 시스템 알고리즘]
- [피어슨 상관계수(Pearson Correlation Coefficient)]
본 문서는 데이터 과학 및 기계 학습 분야에서 널리 사용되는 코사인 유사도의 개념, 수학적 배경, 적용 분야 및 구현 방법을 설명합니다. 정확한 분석을 위해서는 데이터의 특성에 따라 적절한 유사도 지표를 선택하는 것이 중요합니다.
이 문서는 AI 모델(qwen/qwen3.6-35b-a3b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.