餘弦相似度在現實世界中有著多種應用,透過使用嵌入向量,我們能夠以程式化的方式比較現實世界的意義。Python 是數據科學中最受歡迎的語言之一,並提供了多種庫以輕鬆計算餘弦相似度。本文將探討如何利用Scikit-Learn和NumPy這兩個庫在Python中實現餘弦相似度。
何謂餘弦相似度?
餘弦相似度是一種在n維空間中比較兩個非零向量相似度的度量。它被廣泛應用於文本分析和推薦系統等領域,用以判定兩向量在向量空間中方向的相似程度。
餘弦相似度公式
兩個向量A與B之間的餘弦相似度,可使用以下公式計算:
餘弦相似度(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
: 提供多種機器學習演算法,並在其度量套件中包含計算餘弦相似度的方法。
以下是一些示例,展示如何使用Python計算餘弦相似度。我們將使用兩個熟悉的書評向量 [5,3,4] 和 [4,2,4]。
純Python實現
雖然我們之前是手工計算的,但當然,電腦可以做到!以下是如何使用Python,無需額外庫來計算餘弦相似度:
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]}")
優化Python中餘弦相似度計算的技巧
如果您打算使用Python直接計算餘弦相似度,有幾點需要注意:
- 使用優化庫如NumPy或scikit-learn:這些庫針對性能進行了優化,通常比純Python更快。
- 使用Numba:Numba是一個專為優化科學計算函數而建立的Python和NumPy代碼的開源JIT編譯器。
- 使用GPU:若您能使用GPU,請使用如Tensorflow這樣已針對GPU優化的Python庫。
- 並行計算:如果您的硬件支持,考慮將計算並行化以加速處理。
透過AstraDB進行大量向量搜索
若需搜索大量向量,使用如DataStax Astra的向量搜索功能可能更高效且可擴展。Astra DB的向量搜索提供了一個強大的平台,助您執行向量搜索並內建餘弦相似度計算,從而從數據中獲得更深入的洞察。
Source:
https://dzone.com/articles/how-to-implement-cosine-similarity-in-python