補充 使用矩陣運算計算兩組特徵向量相互之間的距離

2021-10-25 20:34:04 字數 1296 閱讀 1073

假設集合a有m個向量,集合b有n個向量。所有向量的維度都是d維。

如何求這m個向量與這n個向量的距離(共m*n個距離)?

一般,我們會想到使用兩重迴圈的方式來求。

for i in range(m):

for j in range(n):

dist[i][j] = ...

但是比較耗時。

我們可以使用矩陣運算來解決。

表示成矩陣形式為:p(m*d矩陣)、c(n*d矩陣)。 結果dist應該是m*n的矩陣。

首先,看一下dist(i,j)的結果。

dist(i,j)應該為p的第i行與c的第j行的距離。

因此,總的dist^2為:

而這四個矩陣都可以比較容易的得到。

import numpy as np

def compute_distances(p, c):

a = (p**2).sum(axis=1, keepdims=true) #先對p求平方;然後按行求和,並且保持維度。得到乙個5行1列的向量。

b = (c**2).sum(axis=1, keepdims=true).t #得到乙個1行4列的向量。

return np.sqrt(a + b - 2* np.dot(p, c.t)) #a+b會廣播運算加法。np.dot()是矩陣相乘。

if __name__ == "__main__":

p = np.random.randint(1, 5, (5, 3)) #5行3列。5個三維向量。

c = np.random.randint(1, 5, (4, 3)) #4行3列。4個三維向量。

dist = compute_distances(p, c)

print(p)

print(c)

print(dist)

結果:

驗證一下,比如p1與c1的距離為:sqrt(9+0+0) = 3,正確。 p5與c4的距離為sqrt(1+1) = 1.414,正確。

位運算計算方式與例項

1.非 是乙個單目運算子,只有乙個運算物件。0變成1,1變成0。例如 二進位制1000 1101 進行位邏輯非運算為 0111 0010,對應十進位制 141等於 142。正數取反 對應的負數 1 負數取反 對應的正數 1 例如 14 15 14 13 2.與 將兩個物件按位與運算,1與1等於1,1...

減一與運算計算漢明重量

刷leetcode還是能學到很多小知識的,今天學到了如何在二進位制數中快速輸出有幾個1,二進位制中1的個數也稱為漢明重量 思路很簡單 1 設個數為0,原始資料是n 2 如果n等於0,輸出個數,如果不等於零,n n n 1 3 個數加1,迴圈 2 舉個例子就很清楚了 n 01001 n n n 1 0...

四則運算計算器

今天做個帶視窗的c 四則運算計算器 輸入中綴表示式 自然表示式 可以用list來放 先把它變成字尾表示式 逆波蘭表示式 用乙個棧放運算子,另乙個棧放字尾表示式 運算子優先順序 1 2 3 4 從左到右遍歷中綴表示式 計算字尾表示式 從左到右掃瞄字尾表示式,如果是數字,放入數字棧。如果是符號,從數字棧...