28、(向量)歐幾里得距離計算

sxj731533730發表於2020-10-25

基本思想:求一組樣本點到一組向量的最短距離,並且輸出其距離資訊

樣本向量點
已 知 的 樣 本 : A = { x 1   y 1 x 2   y 2 } 已 知 的 向 量 : B = { x 3   y 3 x 4   y 4 } 已知的樣本: A=\left\{ \begin{matrix} x_1\ y_1 \\ x_2\ y_2 \\ \end{matrix} \right\} \\ 已知的向量:B= \left\{ \begin{matrix} x_3\ y_3 \\ x_4\ y_4 \\ \end{matrix} \right\} A={x1 y1x2 y2}B={x3 y3x4 y4}

先推導一下基本公式:
d 13 = ( x 1 − x 3 ) 2 + ( y 1 − y 3 ) 2 = x 1 2 + x 3 2 − 2 x 1 x 2 + y 1 2 + y 3 2 − 2 y 1 y 2 d_{13}=\sqrt{(x_1-x_3)^2+(y_1-y_3)^2}=\sqrt{x_1^2+x_3^2-2x_1x_2+y_1^2+y_3^2-2y_1y_2} d13=(x1x3)2+(y1y3)2 =x12+x322x1x2+y12+y322y1y2

d 14 = ( x 1 − x 4 ) 2 + ( y 1 − y 4 ) 2 = x 1 2 + x 4 2 − 2 x 1 x 4 + y 1 2 + y 4 2 − 2 y 1 y 4 d_{14}=\sqrt{(x_1-x_4)^2+(y_1-y_4)^2}=\sqrt{x_1^2+x_4^2-2x_1x_4+y_1^2+y_4^2-2y_1y_4} d14=(x1x4)2+(y1y4)2 =x12+x422x1x4+y12+y422y1y4

d 23 = ( x 2 − x 3 ) 2 + ( y 2 − y 3 ) 2 = x 2 2 + x 3 2 − 2 x 3 x 2 + y 2 2 + y 3 2 − 2 y 3 y 2 d_{23}=\sqrt{(x_2-x_3)^2+(y_2-y_3)^2}=\sqrt{x_2^2+x_3^2-2x_3x_2+y_2^2+y_3^2-2y_3y_2} d23=(x2x3)2+(y2y3)2 =x22+x322x3x2+y22+y322y3y2

d 24 = ( x 2 − x 4 ) 2 + ( y 2 − y 4 ) 2 = x 4 2 + x 2 2 − 2 x 4 x 2 + y 4 2 + y 2 2 − 2 y 4 y 2 d_{24}=\sqrt{(x_2-x_4)^2+(y_2-y_4)^2}=\sqrt{x_4^2+x_2^2-2x_4x_2+y_4^2+y_2^2-2y_4y_2} d24=(x2x4)2+(y2y4)2 =x42+x222x4x2+y42+y222y4y2

尋找樣本點對應的的最小距離
m i n ( d 1 , d 2 , d 3 , d 4 ) min{(d_1,d_2,d_3,d_4)} min(d1,d2,d3,d4)

如果使用python 的numpy計算:
第一步,計算平方和矩陣A、B,其實類似
A = { x 1   y 1 x 2   y 2 } = > A ∗ A T = > A ′ = { x 1 2 + y 1 2   x 2 2 + y 2 2 x 1 2 + y 1 2   x 2 2 + y 2 2 } A= \left\{ \begin{matrix} x_1\ y_1 \\ x_2\ y_2 \\ \end{matrix} \right\} =>A*A^T=>A'= \left\{ \begin{matrix} x_1^2+y_1^2 \ x_2^2 +y_2^2 \\ x_1^2+y_1^2\ x_2^2 +y_2^2 \\ \end{matrix} \right\} A={x1 y1x2 y2}=>AAT=>A={x12+y12 x22+y22x12+y12 x22+y22}

B = { x 3   y 3 x 4   y 4 } = > B ∗ B T = > B ′ = { x 3 2 + y 3 2   x 4 2 + y 4 2 x 3 2 + y 3 2   x 4 2 + y 4 2 } B= \left\{ \begin{matrix} x_3\ y_3 \\ x_4\ y_4 \\ \end{matrix} \right\} =>B*B^T=> B'=\left\{ \begin{matrix} x_3^2+y_3^2 \ x_4^2+y_4^2 \\ x_3^2+y_3^2\ x_4^2+y_4^2 \\ \end{matrix} \right\} B={x3 y3x4 y4}=>BBT=>B={x32+y32 x42+y42x32+y32 x42+y42}

 a2, b2 = np.square(a).sum(axis=1), np.square(b).sum(axis=1)

關於軸axis的變化參考:https://blog.csdn.net/sxj731533730/article/details/108831284
第二步:計算出 A ′ ∗ B ′ T A'*B'^T ABT的乘積矩陣
A ∗ B T = { x 1   y 1 x 2   y 2 } ∗ { x 3   y 3 x 4   y 4 } T = > C = { x 1 ∗ x 3 + y 1 ∗ y 3   x 1 ∗ x 4 + y 1 ∗ y 4 x 2 ∗ x 3 + y 2 ∗ y 3   x 2 ∗ x 4 + y 2 ∗ y 4 } A*B^T= \left\{ \begin{matrix} x_1\ y_1 \\ x_2\ y_2 \\ \end{matrix} \right\}* \left\{ \begin{matrix} x_3\ y_3 \\ x_4\ y_4 \\ \end{matrix} \right\}^T => C=\left\{ \begin{matrix} x_1*x_3+y_1*y_3\ x_1*x_4+y_1*y_4 \\ x_2*x_3+y_2*y_3\ x_2*x_4+y_2*y_4 \\ \end{matrix} \right\} ABT={x1 y1x2 y2}{x3 y3x4 y4}T=>C={x1x3+y1y3 x1x4+y1y4x2x3+y2y3 x2x4+y2y4}
第三步進行計算距離
D = A ′ + B ′ T − 2 C T = { x 1 2 + y 1 2   x 2 2 + y 2 2 x 1 2 + y 1 2   x 2 2 + y 2 2 } + { x 3 2 + y 3 2   x 4 2 + y 4 2 x 3 2 + y 3 2   x 4 2 + y 4 2 } T − 2 ∗ { x 1 ∗ x 3 + y 1 ∗ y 3   x 1 ∗ x 4 + y 1 ∗ y 4 x 2 ∗ x 3 + y 2 ∗ y 3   x 2 ∗ x 4 + y 2 ∗ y 4 } T D=A'+B'^T-2C^T=\left\{ \begin{matrix} x_1^2+y_1^2 \ x_2^2 +y_2^2 \\ x_1^2+y_1^2\ x_2^2 +y_2^2 \\ \end{matrix} \right\} +\left\{ \begin{matrix} x_3^2+y_3^2 \ x_4^2+y_4^2 \\ x_3^2+y_3^2\ x_4^2+y_4^2 \\ \end{matrix} \right\} ^T-2*\left\{ \begin{matrix} x_1*x_3+y_1*y_3\ x_1*x_4+y_1*y_4 \\ x_2*x_3+y_2*y_3\ x_2*x_4+y_2*y_4 \\ \end{matrix} \right\} ^T D=A+BT2CT={x12+y12 x22+y22x12+y12 x22+y22}+{x32+y32 x42+y42x32+y32 x42+y42}T2{x1x3+y1y3 x1x4+y1y4x2x3+y2y3 x2x4+y2y4}T

D = A ′ + B ′ T − 2 C T = { x 1 2 + y 1 2 + x 3 2 + y 3 2   x 2 2 + y 2 2 + x 3 2 + y 3 2 x 1 2 + y 1 2 + x 4 2 + y 4 2   x 2 2 + y 2 2 + x 4 2 + y 4 2 } − 2 ∗ { x 1 ∗ x 3 + y 1 ∗ y 3   x 2 ∗ x 3 + y 2 ∗ y 3 x 1 ∗ x 4 + y 1 ∗ y 4   x 2 ∗ x 4 + y 2 ∗ y 4 } D=A'+B'^T-2C^T=\left\{ \begin{matrix} x_1^2+y_1^2+x_3^2+y_3^2 \ x_2^2 +y_2^2+ x_3^2+y_3^2 \\ x_1^2+y_1^2+x_4^2+y_4^2\ x_2^2 +y_2^2+ x_4^2+y_4^2 \\ \end{matrix} \right\}-2*\left\{ \begin{matrix} x_1*x_3+y_1*y_3\ x_2*x_3+y_2*y_3 \\ x_1*x_4+y_1*y_4 \ x_2*x_4+y_2*y_4 \\ \end{matrix} \right\} D=A+BT2CT={x12+y12+x32+y32 x22+y22+x32+y32x12+y12+x42+y42 x22+y22+x42+y42}2{x1x3+y1y3 x2x3+y2y3x1x4+y1y4 x2x4+y2y4}
D = A ′ + B ′ T − 2 C T = { d 13   d 23 d 14   d 24 } D=A'+B'^T-2C^T=\left\{ \begin{matrix} d_{13} \ d_{23} \\ d_{14}\ d_{24} \\ \end{matrix} \right\} D=A+BT2CT={d13 d23d14 d24}

import numpy as np
def _pdist(a, b):
    a, b = np.asarray(a), np.asarray(b)
    if len(a) == 0 or len(b) == 0:
        return np.zeros((len(a), len(b)))
    a2, b2 = np.square(a).sum(axis=1), np.square(b).sum(axis=1)
    r2 = -2. * np.dot(a, b.T) + a2[:, None] + b2[None, :]
    r2 = np.clip(r2, 0., float(np.inf))
    return r2
def _nn_euclidean_distance(x, y):
    distances = _pdist(x, y)
    return np.maximum(0.0, distances.min(axis=0))
a=np.asarray([[6,7],[4,8]])
b=np.asarray([[6,8],[7,9]])
print(_nn_euclidean_distance(a,b)

測試結果

C:\Users\sxj\venv\Scripts\python.exe E:/deepsort/deep_sort/test.py
[1. 5.]

Process finished with exit code 0

C++:

相關文章