벡터 간 유사성 측정의 핵심 개념
7/7/15
\[\cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}||\mathbf{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}}\]
1단계: 내적 계산 \[\mathbf{A} \cdot \mathbf{B} = 3 \times 1 + 4 \times 2 = 11\]
2단계: 각 벡터의 크기 \[|\mathbf{A}| = \sqrt{3^2 + 4^2} = 5\] \[|\mathbf{B}| = \sqrt{1^2 + 2^2} = \sqrt{5}\]
3단계: 코사인 유사도 \[\cos(\theta) = \frac{11}{5 \times \sqrt{5}} = \frac{11}{5\sqrt{5}} \approx 0.982\]
\[d = \sqrt{\sum_{i=1}^{n} (A_i - B_i)^2}\]
\[d = \sum_{i=1}^{n} |A_i - B_i|\]
\[\cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}||\mathbf{B}|}\]
문서 1: “머신러닝은 인공지능의 한 분야입니다” 문서 2: “딥러닝은 머신러닝의 한 방법입니다”
단어 | 문서1 | 문서2 |
---|---|---|
머신러닝 | 1 | 1 |
인공지능 | 1 | 0 |
딥러닝 | 0 | 1 |
분야 | 1 | 0 |
방법 | 0 | 1 |
해석: 중간 정도의 유사성
사용자 | 영화A | 영화B | 영화C | 영화D |
---|---|---|---|---|
사용자1 | 5 | 3 | 0 | 1 |
사용자2 | 4 | 0 | 0 | 1 |
사용자3 | 1 | 1 | 0 | 5 |
사용자4 | 1 | 0 | 0 | 4 |
\[\cos(\theta) = \frac{5×4 + 3×0 + 0×0 + 1×1}{\sqrt{5^2+3^2+0^2+1^2} × \sqrt{4^2+0^2+0^2+1^2}}\] \[= \frac{21}{\sqrt{35} × \sqrt{17}} ≈ 0.86\]
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
def cosine_similarity_manual(A, B):
"""
수동으로 코사인 유사도 계산
"""
dot_product = np.dot(A, B)
norm_A = np.linalg.norm(A)
norm_B = np.linalg.norm(B)
return dot_product / (norm_A * norm_B)
# 예제 벡터
vector_A = np.array([1, 2, 3, 4])
vector_B = np.array([2, 4, 6, 8])
vector_C = np.array([1, 0, -1, 0])
# 수동 계산
sim_AB = cosine_similarity_manual(vector_A, vector_B)
sim_AC = cosine_similarity_manual(vector_A, vector_C)
print(f"A와 B의 유사도: {sim_AB:.3f}") # 1.000 (완전히 동일한 방향)
print(f"A와 C의 유사도: {sim_AC:.3f}") # 0.000 (수직)
# scikit-learn 사용
vectors = np.array([vector_A, vector_B, vector_C])
similarity_matrix = cosine_similarity(vectors)
print("유사도 행렬:")
print(similarity_matrix)
# 기본 함수로 구현
cosine_similarity <- function(A, B) {
dot_product <- sum(A * B)
norm_A <- sqrt(sum(A^2))
norm_B <- sqrt(sum(B^2))
return(dot_product / (norm_A * norm_B))
}
# 예제 벡터
vector_A <- c(1, 2, 3, 4)
vector_B <- c(2, 4, 6, 8)
vector_C <- c(1, 0, -1, 0)
# 유사도 계산
sim_AB <- cosine_similarity(vector_A, vector_B)
sim_AC <- cosine_similarity(vector_A, vector_C)
cat("A와 B의 유사도:", round(sim_AB, 3), "\n")
cat("A와 C의 유사도:", round(sim_AC, 3), "\n")
# 패키지 사용 (lsa 패키지)
library(lsa)
cosine(vector_A, vector_B)
cosine(vector_A, vector_C)
# 행렬 형태로 한 번에 계산
vectors <- rbind(vector_A, vector_B, vector_C)
similarity_matrix <- cosine(t(vectors))
print(similarity_matrix)
\[\cos(\theta) = \frac{\sum_{i=1}^{n} (A_i - \bar{A})(B_i - \bar{B})}{\sqrt{\sum_{i=1}^{n} (A_i - \bar{A})^2} \sqrt{\sum_{i=1}^{n} (B_i - \bar{B})^2}}\]
\[\cos(\theta) = \frac{\sum_{i=1}^{n} w_i A_i B_i}{\sqrt{\sum_{i=1}^{n} w_i A_i^2} \sqrt{\sum_{i=1}^{n} w_i B_i^2}}\]
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# 예제 문서들
documents = [
"머신러닝은 인공지능의 한 분야입니다",
"딥러닝은 머신러닝의 발전된 형태입니다",
"자연어 처리는 컴퓨터가 인간의 언어를 이해하는 기술입니다",
"컴퓨터 비전은 이미지를 분석하는 AI 기술입니다"
]
# TF-IDF 벡터화
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)
# 코사인 유사도 계산
similarity_matrix = cosine_similarity(tfidf_matrix)
# 결과 출력
feature_names = vectorizer.get_feature_names_out()
print("특성 단어들:", feature_names)
print("\n문서 간 유사도 행렬:")
for i, doc in enumerate(documents):
print(f"\n문서 {i+1}: {doc[:20]}...")
for j, similarity in enumerate(similarity_matrix[i]):
if i != j:
print(f" vs 문서 {j+1}: {similarity:.3f}")
연락처: euriion@gmail.com
GitHub: github.com/euriion
블로그: euriion.com
코사인 유사도 | 홍성학