计算矩阵A与矩阵B的欧式距离

本文从向量的欧式距离出发,逐步解析如何扩展到矩阵的欧式距离计算。通过具体的数学推导,展示了如何将两个矩阵之间的距离表示为一个新的矩阵,并且强调了计算过程中向量的L2范数和向量乘法的关系。

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=(a11b11)2+(a12b12)2+(a13b13)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+b1322a11b112a12b122a13b13

从变形后的公式我们可以看出相当于 ( a − b ) 2 = a 2 + b 2 − 2 a b (a-b)^2=a^2+b^2-2ab (ab)2=a2+b22ab

我们可以变形为下列计算(两个向量的L2范数):
d i s t x , y = ∥ x − y ∥ 2 dist_{x,y}=\left \| x-y \right \|_2 distx,y=xy2
第一种方式

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=(a11b11)2+(a12b12)2+(a13b13)2 =a1b12
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=(a11b21)2+(a12b22)2+(a13b23)2 =a1b22
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=(a11b31)2+(a12b32)2+(a13b33)2 =a1b32

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=(a21b11)2+(a22b12)2+(a23b13)2 =a2b12
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=(a21b21)2+(a22b22)2+(a23b23)2 =a2b22
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=(a21b31)2+(a22b32)2+(a23b33)2 =a2b32

可以看出A中的每个行向量使用了3次(B的行数)和B中的每一行列向量使用了2次(A的行数):
参照向量的欧式距离计算,转化成
( a − b ) 2 = a 2 + b 2 − 2 a b (a-b)^2=a^2+b^2-2ab (ab)2=a2+b22ab
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)T2ABT

# 矩阵欧式距离计算
# 矩阵计算方法
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.]]
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值