余弦相似度及基於python的余弦相似度實現

2021-10-01 05:51:37 字數 2124 閱讀 5851

余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。對於兩個向量,可以想象成空間中的兩條線段,都是從原點([0, 0, ...])出發,指向不同的方向。兩條線段之間形成乙個夾角:如果夾角為0度,則意味著方向相同、線段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

對n維向量a,b,假設a= [a1, a2, ..., an] ,b= [b1, b2, ..., bn] ,則a與b的夾角θ的余弦等於:

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

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

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

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

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

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

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

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

使用者對內容評分,按5分制,x和y兩個使用者對兩個內容的評分分別為(1,2)和(4,5),使用余弦相似度得到的結果是0.98,兩者極為相似。但從評分上看x似乎不喜歡2這個 內容,而y則比較喜歡,余弦相似度對數值的不敏感導致了結果的誤差,需要修正這種不合理性就出現了調整余弦相似度,即所有維度上的數值都減去乙個均值,比如x和y的評分均值都是3,那麼調整後為(-2,-1)和(1,2),再用余弦相似度計算,得到-0.8,相似度為負值並且差異不小,但顯然更加符合現實。

方法一:

def cosine_similarity(x, y, dim=256):

xx = 0.0

yy = 0.0

xy = 0.0

for i in range(dim):

xx += x[i] * x[i]

yy += y[i] * y[i]

xy += x[i] * y[i]

xx_sqrt = xx ** 0.5

yy_sqrt = yy ** 0.5

cos = xy/(xx_sqrt*yy_sqrt)*0.5+0.5

return cos

方法二:

import numpy as np

def cosine_similarity(x,y):

num = x.dot(y.t)

denom = np.linalg.norm(x) * np.linalg.norm(y)

return num / denom

方法三:

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

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)

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])))

return 0.5 * cos + 0.5 if norm else cos

python 余弦相似度

余弦相似度相關係數 建立樣本與分詞 s1 本週末去釣魚 s1 cut i for i in jieba.cut s1,cut all true s2 下週去花卉市場買花 s2 cut i for i in jieba.cut s2,cut all true word set set s1 cut u...

余弦相似度

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

余弦相似度

基於餘弦定理計算相似度的應用很多,比如推薦系統中的協同過濾,計算文字的相似性等等。它用計算兩者空間向量的夾角來表示兩者的相似性。先看一下餘弦定理的公式 wu v u ivi u2i v 2i 上訴公式表示uv兩者的相似度,ui表示u在i緯度的數值。在使用者行為資料 使用者只有操作和未操作兩種狀態,也...