numpy 計算特徵之間的余弦距離

2022-03-14 02:47:11 字數 1585 閱讀 8527

余弦距離在計算相似度的應用中經常使用,比如:

下面是余弦相似度

的計算公式(圖來自wikipedia):

但是,余弦相似度和常用的歐式距離的有所區別。

歐式距離用於相似度檢索更符合直覺。因此在使用時,需要將余弦相似度轉化成類似歐氏距離的余弦距離。

維基頁面中給出的角距離計算公式如下(圖來自wikipedia):

余弦距離 = 1- 余弦相似度

根據輸入資料的不同,分為兩種模式處理。

1 importnumpy as np

2 defcosine_distance(a, b):

3 if a.shape !=b.shape:

4 raise runtimeerror("array {} shape not match {}".format(a.shape, b.shape))

5 if a.ndim==1:

6 a_norm =np.linalg.norm(a)

7 b_norm =np.linalg.norm(b)

8 elif a.ndim==2:

9 a_norm = np.linalg.norm(a, axis=1, keepdims=true)

10 b_norm = np.linalg.norm(b, axis=1, keepdims=true)

11 else:

12 raise runtimeerror("array dimensions {} not right".format(a.ndim))

13 similiarity = np.dot(a, b.t)/(a_norm *b_norm)

14 dist = 1. -similiarity

15 return dist

6~7 行 ,np.linalg.norm操作是求向量的正規化,預設是l2正規化,等同於求向量的歐式距離。

9~10行 ,設定引數 axis=1 。對於歸一化二維向量時,將資料按行向量處理,相當於單獨對每張特徵進行歸一化處理。

13行,np.dot操作可以支援兩種模式的運算,來自官方文件的解釋:

numpy.dot(a, b, out=none

)dot product of two arrays. specifically,

為了保持一致性,都使用了轉置操作。如下圖所示,矩陣乘法按線性代數定義,必須是 行 × 列才能完成乘法運算。舉例 32張128維特徵進行運算,則應該是 32x128 * 128x32 才行。

pytorch計算兩個特徵的余弦相似度

首先,我們要記住一點,兩個特徵的余弦相似度計算出來的範圍是 1,1 其實,對於兩個特徵,它們的余弦相似度就是兩個特徵在經過l2歸一化之後的矩陣內積。如下 import torch import torch.nn.functional as f 假設feature1為n c w h,feature2也...

numpy的矩陣計算

給乙個向量a 0,1,2 每個元素乘以2 a for e in a 或者a 2 e for e in a 或者a np.array 2 e for e in a 這個比較快 如果是numpy的array 直接2 a就可以了這個最快 universal functions 1,1都可以 np.abs ...

numpy的矩陣計算

arr1 np.arange 1,6 arr2 np.array 10 20,30 40,50 print arr1 print arr2 print arr1 arr2 展示 12 345 102030 4050 1122 334455 注意點 1 一維陣列的元素個數是相同的,不然無法完成廣播 2...