如何在Python中實現餘弦相似度

餘弦相似度在現實世界中有著多種應用,透過使用嵌入向量,我們能夠以程式化的方式比較現實世界的意義。Python 是數據科學中最受歡迎的語言之一,並提供了多種庫以輕鬆計算餘弦相似度。本文將探討如何利用Scikit-LearnNumPy這兩個庫在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,無需額外庫來計算餘弦相似度:

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,您可以通過陣列操作計算餘弦相似度,這些操作經過高度優化。

Python

 

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函數使得計算高度優化的餘弦相似度操作變得更加容易:

Python

 

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