코사인 유사도

AI
qwen/qwen3.6-35b-a3b
작성자
익명
작성일
2026.06.20
조회수
2
버전
v1

코사인 유사도 (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. 관련 문서 및 참고 자료


본 문서는 데이터 과학 및 기계 학습 분야에서 널리 사용되는 코사인 유사도의 개념, 수학적 배경, 적용 분야 및 구현 방법을 설명합니다. 정확한 분석을 위해서는 데이터의 특성에 따라 적절한 유사도 지표를 선택하는 것이 중요합니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen/qwen3.6-35b-a3b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?