计算矩阵A与矩阵B的欧式距离
1. 从向量的欧式距离谈起
向量x为1x3的行向量,向量y为1x3的行向量,求向量x与向量y的欧式距离
x
=
(
a
11
a
12
a
13
)
x = \begin{pmatrix}a_{11} & a_{12} & a_{13}\\\end{pmatrix}
x=(a11a12a13)
y
=
(
b
11
b
12
b
13
)
y = \begin{pmatrix}b_{11} & b_{12} & b_{13}\\\end{pmatrix}
y=(b11b12b13)
d i s t x , y = ( a 11 − b 11 ) 2 + ( a 12 − b 12 ) 2 + ( a 13 − b 13 ) 2 dist_{x,y}=\sqrt{(a_{11} - b_{11})^2 + (a_{12} - b_{12})^2 + (a_{13} - b_{13})^2} distx,y=(a11−b11)2+(a12−b12)2+(a13−b13)2
变形为:
d
i
s
t
x
,
y
=
a
11
2
+
a
12
2
+
a
13
2
+
b
11
2
+
b
12
2
+
b
13
2
−
2
a
11
b
11
−
2
a
12
b
12
−
2
a
13
b
13
dist_{x,y}=\sqrt{a_{11}^2 + a_{12}^2 + a_{13}^2 + b_{11}^2 + b_{12}^2 + b_{13}^2 - 2a_{11}b_{11} - 2a_{12}b_{12} - 2a_{13}b_{13} }
distx,y=a112+a122+a132+b112+b122+b132−2a11b11−2a12b12−2a13b13
从变形后的公式我们可以看出相当于 ( a − b ) 2 = a 2 + b 2 − 2 a b (a-b)^2=a^2+b^2-2ab (a−b)2=a2+b2−2ab
我们可以变形为下列计算(两个向量的L2范数):
d
i
s
t
x
,
y
=
∥
x
−
y
∥
2
dist_{x,y}=\left \| x-y \right \|_2
distx,y=∥x−y∥2
第一种方式
import numpy as np
x = np.mat([1.0, 2.0, 3.0])
y = np.mat([4.0, 5.0, 6.0])
dist = np.sqrt(np.sum(np.power(x - y, 2)))
print(dist)
# 5.196152422706632
dist = np.sqrt(np.power(x, 2).sum() + np.power(y, 2).sum() - 2 * np.dot(x, y.T)).sum()
print(dist)
# 5.196152422706632
2. 从向量的欧式距离扩展到矩阵的欧式距离
向量A为2x3的行向量,向量B为3x3的行向量,求向量A与向量B的欧式距离
A
=
(
a
1
a
2
)
=
(
a
11
a
12
a
13
a
21
a
22
a
23
)
A = \begin{pmatrix} a_{1} \\ a_{2} \end{pmatrix} = \begin{pmatrix} a_{11} & a_{12} & a_{13}\\ a_{21} & a_{22} & a_{23} \end{pmatrix}
A=(a1a2)=(a11a21a12a22a13a23)
B
=
(
b
1
b
2
b
3
)
=
(
b
11
b
12
b
13
b
21
b
22
b
23
b
31
b
32
b
33
)
B = \begin{pmatrix} b_{1} \\ b_{2}\\ b_{3} \end{pmatrix} = \begin{pmatrix} b_{11} & b_{12} & b_{13}\\ b_{21} & b_{22} & b_{23}\\ b_{31} & b_{32} & b_{33} \end{pmatrix}
B=⎝⎛b1b2b3⎠⎞=⎝⎛b11b21b31b12b22b32b13b23b33⎠⎞
矩阵A与矩阵B的欧式距离,会形成矩阵C,其维度为2x3
C
=
(
c
1
c
2
)
=
(
c
11
c
12
c
13
c
21
c
22
c
23
)
C = \begin{pmatrix} c_{1} \\ c_{2} \end{pmatrix}= \begin{pmatrix} c_{11} & c_{12} & c_{13}\\ c_{21} & c_{22} & c_{23} \end{pmatrix}
C=(c1c2)=(c11c21c12c22c13c23)
d
i
s
t
c
11
=
(
a
11
−
b
11
)
2
+
(
a
12
−
b
12
)
2
+
(
a
13
−
b
13
)
2
=
∥
a
1
−
b
1
∥
2
dist_{c_{11}}=\sqrt{(a_{11} - b_{11})^2 + (a_{12} - b_{12})^2 + (a_{13} - b_{13})^2} = \left \| a_1-b_1 \right \|_2
distc11=(a11−b11)2+(a12−b12)2+(a13−b13)2=∥a1−b1∥2
d
i
s
t
c
12
=
(
a
11
−
b
21
)
2
+
(
a
12
−
b
22
)
2
+
(
a
13
−
b
23
)
2
=
∥
a
1
−
b
2
∥
2
dist_{c_{12}}=\sqrt{(a_{11} - b_{21})^2 + (a_{12} - b_{22})^2 + (a_{13} - b_{23})^2} = \left \| a_1-b_2 \right \|_2
distc12=(a11−b21)2+(a12−b22)2+(a13−b23)2=∥a1−b2∥2
d
i
s
t
c
13
=
(
a
11
−
b
31
)
2
+
(
a
12
−
b
32
)
2
+
(
a
13
−
b
33
)
2
=
∥
a
1
−
b
3
∥
2
dist_{c_{13}}=\sqrt{(a_{11} - b_{31})^2 + (a_{12} - b_{32})^2 + (a_{13} - b_{33})^2} = \left \| a_1-b_3 \right \|_2
distc13=(a11−b31)2+(a12−b32)2+(a13−b33)2=∥a1−b3∥2
d
i
s
t
c
21
=
(
a
21
−
b
11
)
2
+
(
a
22
−
b
12
)
2
+
(
a
23
−
b
13
)
2
=
∥
a
2
−
b
1
∥
2
dist_{c_{21}}=\sqrt{(a_{21} - b_{11})^2 + (a_{22} - b_{12})^2 + (a_{23} - b_{13})^2} = \left \| a_2-b_1 \right \|_2
distc21=(a21−b11)2+(a22−b12)2+(a23−b13)2=∥a2−b1∥2
d
i
s
t
c
22
=
(
a
21
−
b
21
)
2
+
(
a
22
−
b
22
)
2
+
(
a
23
−
b
23
)
2
=
∥
a
2
−
b
2
∥
2
dist_{c_{22}}=\sqrt{(a_{21} - b_{21})^2 + (a_{22} - b_{22})^2 + (a_{23} - b_{23})^2}= \left \| a_2-b_2 \right \|_2
distc22=(a21−b21)2+(a22−b22)2+(a23−b23)2=∥a2−b2∥2
d
i
s
t
c
23
=
(
a
21
−
b
31
)
2
+
(
a
22
−
b
32
)
2
+
(
a
23
−
b
33
)
2
=
∥
a
2
−
b
3
∥
2
dist_{c_{23}}=\sqrt{(a_{21} - b_{31})^2 + (a_{22} - b_{32})^2 + (a_{23} - b_{33})^2}= \left \| a_2-b_3 \right \|_2
distc23=(a21−b31)2+(a22−b32)2+(a23−b33)2=∥a2−b3∥2
可以看出A中的每个行向量使用了3次(B的行数)和B中的每一行列向量使用了2次(A的行数):
参照向量的欧式距离计算,转化成
(
a
−
b
)
2
=
a
2
+
b
2
−
2
a
b
(a-b)^2=a^2+b^2-2ab
(a−b)2=a2+b2−2ab
C
=
s
u
m
(
A
2
,
a
x
i
s
=
1
)
∗
o
n
e
s
(
(
1
,
3
)
)
+
o
n
e
s
(
(
2
,
1
)
)
∗
s
u
m
(
B
2
,
a
x
i
s
=
1
)
T
−
2
A
B
T
C=sum(A^2, axis=1) * ones((1, 3)) + ones((2, 1)) * sum(B^2, axis=1)^T - 2AB^T
C=sum(A2,axis=1)∗ones((1,3))+ones((2,1))∗sum(B2,axis=1)T−2ABT
# 矩阵欧式距离计算
# 矩阵计算方法
A = np.mat([[1.0, 2.0, 3.0], [2.0, 3.0, 4.0]])
B = np.mat([[3.0, 4.0, 5.0], [4.0, 5.0, 6.0], [5.0, 6.0, 7.0]])
C = np.sum(np.power(A, 2), 1) * np.ones((1, 3)) + np.ones((2, 1)) * np.sum(np.power(B, 2), 1).T - 2 * A * B.T
print(C)
# [[12. 27. 48.] [ 3. 12. 27.]]
# 逐行向量计算方法(用于验证)
C = np.mat(np.zeros((2, 3), dtype=float))
for i in range(2):
for j in range(3):
C[i, j] = np.sum(np.power(A[i] - B[j], 2))
print(C)
#[[12. 27. 48.] [ 3. 12. 27.]]
本文从向量的欧式距离出发,逐步解析如何扩展到矩阵的欧式距离计算。通过具体的数学推导,展示了如何将两个矩阵之间的距离表示为一个新的矩阵,并且强调了计算过程中向量的L2范数和向量乘法的关系。
847

被折叠的 条评论
为什么被折叠?



