1. 从向量的欧式距离谈起
向量x为1x3的行向量,向量y为1x3的行向量,求向量x与向量y的欧式距离
x=(a11a12a13)
y=(b11b12b13)
distx,y=(a11−b11)2+(a12−b12)2+(a13−b13)2
变形为:
distx,y=a112+a122+a132+b112+b122+b132−2a11b11−2a12b12−2a13b13
从变形后的公式我们可以看出相当于(a−b)2=a2+b2−2ab
我们可以变形为下列计算(两个向量的L2范数):
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=(a1a2)=(a11a21a12a22a13a23)
B=⎝⎛b1b2b3⎠⎞=⎝⎛b11b21b31b12b22b32b13b23b33⎠⎞
矩阵A与矩阵B的欧式距离,会形成矩阵C,其维度为2x3
C=(c1c2)=(c11c21c12c22c13c23)
distc11=(a11−b11)2+(a12−b12)2+(a13−b13)2=∥a1−b1∥2
distc12=(a11−b21)2+(a12−b22)2+(a13−b23)2=∥a1−b2∥2
distc13=(a11−b31)2+(a12−b32)2+(a13−b33)2=∥a1−b3∥2
distc21=(a21−b11)2+(a22−b12)2+(a23−b13)2=∥a2−b1∥2
distc22=(a21−b21)2+(a22−b22)2+(a23−b23)2=∥a2−b2∥2
distc23=(a21−b31)2+(a22−b32)2+(a23−b33)2=∥a2−b3∥2
可以看出A中的每个行向量使用了3次(B的行数)和B中的每一行列向量使用了2次(A的行数):
参照向量的欧式距离计算,转化成(a−b)2=a2+b2−2ab
C=sum(A2,axis=1)∗ones((1,3))+ones((1,3))∗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.]]