計算向量相似度 余弦相似度

2021-10-08 08:58:18 字數 2980 閱讀 7990

1.余弦相似度可用來計算兩個向量的相似程度

對於如何計算兩個向量的相似程度問題,可以把這它們想象成空間中的兩條線段,都是從原點([0, 0, …])出發,指向不同的方向。兩條線段之間形成乙個夾角,如果夾角為0度,意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

以二維空間為例,上圖的a和b是兩個向量,我們要計算它們的夾角θ。餘弦定理告訴我們,可以用下面的公式求得:

假定a向量是[x1, y1],b向量是[x2, y2],那麼可以將餘弦定理改寫成下面的形式:

余弦的這種計算方法對n維向量也成立。假定a和b是兩個n維向量,a是 [a1, a2, …, an] ,b是 [b1, b2, …, bn] ,則a與b的夾角θ的余弦等於:

余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"余弦相似性"。

余弦值的範圍在[-1,1]之間,值越趨近於1,代表兩個向量的方向越接近;越趨近於-1,他們的方向越相反;接近於0,表示兩個向量近乎於正交。

特殊情況分析:

(1)夾角為0度 :此時向量a與向量b應該是最相似的,余弦相似度應該為1。按照公式(4),我們計算很容易計算出來cosθ=1。

(2)夾角為90度 :此時余弦相似度為0。

(3)夾角為180度 :此時余弦相似度為-1,兩個向量的方向完全相反。

一般情況下,相似度都是歸一化到[0,1]區間內,因此余弦相似度表示為 cosinesim = 0.5cosθ + 0.5

余弦相似度的python實現

複製**

import numpy as np

def bit_product_sum(x, y):

return sum([item[0] * item[1] for item in zip(x, y)])

def cosine_similarity(x, y, norm=false):

「」" 計算兩個向量x和y的余弦相似度 「」"

assert len(x) == len(y), 「len(x) != len(y)」

zero_list = [0] * len(x)

if x == zero_list or y == zero_list:

return float(1) if x == y else float(0)

# method 1

res = np.array([[x[i] * y[i], x[i] * x[i], y[i] * y[i]] for i in range(len(x))])

cos = sum(res[:, 0]) / (np.sqrt(sum(res[:, 1])) * np.sqrt(sum(res[:, 2])))

# method 2

# cos = bit_product_sum(x, y) / (np.sqrt(bit_product_sum(x, x)) * np.sqrt(bit_product_sum(y, y)))

# method 3

# dot_product, square_sum_x, square_sum_y = 0, 0, 0

# for i in range(len(x)):

# dot_product += x[i] * y[i]

# square_sum_x += x[i] * x[i]

# square_sum_y += y[i] * y[i]

# cos = dot_product / (np.sqrt(square_sum_x) * np.sqrt(square_sum_y))

return 0.5 * cos + 0.5 if norm else cos # 歸一化到[0, 1]區間內

ifname== 『main』:

print cosine_similarity([0, 0], [0, 0]) # 1.0

print cosine_similarity([1, 1], [0, 0]) # 0.0

print cosine_similarity([1, 1], [-1, -1]) # -1.0

print cosine_similarity([1, 1], [2, 2]) # 1.0

print cosine_similarity([3, 3], [4, 4]) # 1.0

print cosine_similarity([1, 2, 2, 1, 1, 1, 0], [1, 2, 2, 1, 1, 2, 1]) # 0.938194187433

複製**

余弦相識度 vs 歐氏距離

余弦距離使用兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比歐氏距離,余弦距離更加注重兩個向量在方向上的差異。

借助三維座標系來看下歐氏距離和余弦距離的區別:

從上圖可以看出,歐氏距離衡量的是空間各點的絕對距離,跟各個點所在的位置座標直接相關;而余弦距離衡量的是空間向量的夾角,更加體現在方向上的差異,而不是位置。

如果保持a點位置不變,b點朝原方向遠離座標軸原點,那麼這個時候余弦距離是保持不變的(因為夾角沒有發生變化),而a、b兩點的距離顯然在發生改變,這就是歐氏距離和余弦距離之間的不同之處。

歐氏距離和余弦距離各自有不同的計算方式和衡量特徵,因此它們適用於不同的資料分析模型:

歐氏距離能夠體現個體數值特徵的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用使用者行為指標分析使用者價值的相似度或差異。

余弦距離更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用使用者對內容評分來區分興趣的相似度和差異,同時修正了使用者間可能存在的度量標準不統一的問題(因為余弦距離對絕對數值不敏感)。

正因為余弦相似度在數值上的不敏感,會導致這樣一種情況存在:

在計算文字相似度上基本流程

(3)生成兩篇文章各自的詞頻向量;

(4)計算兩個向量的余弦相似度,值越大就表示越相似。

相似度計算之余弦相似度

一 定義及概念 余弦取值範圍為 1,1 求得兩個向量的夾角,並得出夾角對應的余弦值,此余弦值就可以用來表徵這兩個向量的相似性。夾角越小,趨近於0度,余弦值越接近於1,它們的方向更加吻合,則越相似。當兩個向量的方向完全相反夾角余弦取最小值 1。當余弦值為0時,兩向量正交,夾角為90度。因此可以看出,余...

余弦相似度計算

余弦相似度計算 余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 我們知道,對於兩個向量,如果他們之間的夾角越小,那麼我們認為這兩個向量是越相似的。余弦相似性就是利用了這個理論思想。它通過計算兩個向...

余弦相似度

余弦距離 歐氏距離和傑卡德相似性度量的對比分析 1 余弦距離 余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。向量,是多維空間中有方向的線段,如果兩個向量的方向一致,即夾角接近零,那麼這兩個向量就相近。而要確定兩個向量方向是否一致,這就要用到餘弦定理...