코사인 유사도는 여러 실제 응용 사례가 있으며, 임베딩 벡터를 사용하여 프로그래밍 방식으로 실세계의 의미를 비교할 수 있습니다. Python은 데이터 과학을 위한 가장 인기 있는 언어 중 하나이며, 코사인 유사도를 쉽게 계산할 수 있는 다양한 라이브러리를 제공합니다. 이 기사에서는 Scikit-Learn 및 NumPy 라이브러리의 도움을 받아 Python에서 코사인 유사도를 구현하는 방법에 대해 논의할 것입니다.
코사인 유사도란?
코사인 유사도는 n차원 공간의 두 비영 벡터 간의 유사도를 측정하는 척도입니다. 이는 텍스트 분석 및 추천 시스템과 같은 다양한 응용 프로그램에서 두 벡터가 벡터 공간에서 방향이 얼마나 유사한지 결정하는 데 사용됩니다.
코사인 유사도 공식
두 벡터 A와 B 사이의 코사인 유사도는 다음 공식을 사용하여 계산됩니다.
Cosine Similarity (A, B) = (A · B) / (||A|| * ||B||)
이 공식에서 A · B는 벡터 A와 B의 내적을 나타냅니다. 이는 두 벡터의 상응하는 성분을 곱하고 결과를 합산하여 계산됩니다. ||A||는 벡터 A의 유클리드 노름(크기)을 나타내며, 이는 그 성분들의 제곱의 합의 제곱근입니다. 계산은 ||A|| = √(A₁² + A₂² + … + Aₙ²) 로 이루어집니다. ||B||는 벡터 B의 유클리드 노름(크기)로, ||A||와 같은 방식으로 계산됩니다.
코사인 유사도 계산 방법
코사인 유사도를 계산하려면 먼저 두 벡터의 내적을 계산합니다. 그런 다음, 그것을 두 벡터의 크기의 곱으로 나눕니다. 그 결과 값은 -1에서 1 사이의 범위에 있으며:
- 코사인 유사도가 1이면, 벡터가 같은 방향을 가리키고 완전히 유사함을 의미합니다.
- 코사인 유사도가 0이면, 벡터가 서로 직교하고 유사성이 없음을 의미합니다.
- 코사인 유사도가 -1이면, 벡터가 반대 방향을 가리키고 완전히 비유사함을 의미합니다.
텍스트 분석에서 코사인 유사도는 문서 벡터 간의 유사성을 측정하는 데 사용됩니다. 여기서 각 문서는 문서루트에서 각 단어나 용어에 해당하는 차원으로 고차원 공간에서 벡터로 표현됩니다. 문서 벡터 간의 코사인 유사도를 계산함으로써, 두 문서가 얼마나 유사하거나 비슷하지 않은지 결정할 수 있습니다.
코사인 유사도 계산을 위한 라이브러리
NumPy
: 수치 연산에 적합하며, 속도 최적화가 되어 있습니다.scikit-learn
: 다양한 머신러닝 알고리즘을 제공하며 메트릭스 패키지에서 코사인 유사도 방법을 포함합니다.
다음은 파이썬을 사용하여 코사인 유사도를 계산하는 방법을 보여주는 몇 가지 예입니다. 이제 익숙한 두 개의 도서 리뷰 벡터 [5,3,4]와 [4,2,4]를 사용할 것입니다.
순수 파이썬
이전에는 수동으로 계산했지만 물론 컴퓨터도 할 수 있습니다! 추가 라이브러리 없이 파이썬으로 코사인 유사도를 계산하는 방법은 다음과 같습니다:
A = [5, 3, 4]
B = [4, 2, 4]
# Calculate dot product
dot_product = sum(a*b for a, b in zip(A, B))
# Calculate the magnitude of each vector
magnitude_A = sum(a*a for a in A)**0.5
magnitude_B = sum(b*b for b in B)**0.5
# Compute cosine similarity
cosine_similarity = dot_product / (magnitude_A * magnitude_B)
print(f"Cosine Similarity using standard Python: {cosine_similarity}")
NumPy
임베딩 벡터는 일반적으로 수백, 수천, 심지어 수백만 개 이상의 많은 차원을 가지고 있습니다! NumPy를 사용하면 고도로 최적화된 배열 연산을 사용하여 코사인 유사도를 계산할 수 있습니다.
import numpy as np
A = np.array([5, 3, 4])
B = np.array([4, 2, 4])
dot_product = np.dot(A, B)
magnitude_A = np.linalg.norm(A)
magnitude_B = np.linalg.norm(B)
cosine_similarity = dot_product / (magnitude_A * magnitude_B)
print(f"Cosine Similarity using NumPy: {cosine_similarity}")
Scikit-Learn
scikit-learn의 cosine_similarity
함수를 사용하면 고도로 최적화된 코사인 유사도 연산을 계산하기가 훨씬 쉬워집니다:
from sklearn.metrics.pairwise import cosine_similarity
A = np.array([[5, 3, 4]])
B = np.array([[4, 2, 4]])
cosine_similarity_result = cosine_similarity(A, B)
print(f"Cosine Similarity using scikit-learn: {cosine_similarity_result[0][0]}")
파이썬에서 코사인 유사도 계산을 최적화하기 위한 팁
파이썬을 직접 사용하여 코사인 유사도를 계산하려는 경우 고려해야 할 몇 가지 사항이 있습니다:
- NumPy나 scikit-learn과 같은 최적화된 라이브러리 사용:이러한 라이브러리는 성능을 최적화하고 일반적으로 순수 파이썬보다 빠릅니다.
- Numba 사용:Numba는 특히 과학 계산 함수를 최적화하기 위해 구축된 파이썬 및 NumPy 코드용 오픈 소스 JIT 컴파일러입니다.
- GPU 사용: GPU에 접근할 수 있다면 Tensorflow와 같이 GPU에 최적화된 Python 라이브러리를 사용하세요.
- 계산 병렬화: 하드웨어 능력이 있다면 계산을 병렬화하여 속도를 높이는 것을 고려하세요.
AstraDB의 벡터 검색을 통해 많은 수의 벡터를 검색하십시오.
많은 수의 벡터를 검색해야 할 경우, DataStax Astra의 벡터 검색 기능과 같은 벡터 데이터베이스를 사용하는 것이 더 효율적이고 확장 가능할 수 있습니다. Astra DB의 벡터 검색은 내장된 코사인 유사도 계산을 통해 벡터 검색을 수행할 수 있는 강력한 플랫폼을 제공하므로 데이터로부터 더 많은 인사이트를 얻을 수 있습니다.
Source:
https://dzone.com/articles/how-to-implement-cosine-similarity-in-python