如何计算矩阵和向量的距离?
How to compute distance for a matrix and a vector?
在python中,给定一个大小为2*3
的矩阵
A=[[x11,x12,x13],[x21,x22,x23]]
和一个列向量 b=[mu1;mu2]
。如果我想计算 A
和向量 b
的每一列之间的欧氏距离。例如,对于第一列,距离“d1”由
给出
A=[[x11,x12,x13],[x21,x22,x23]]
b=[[mu1],[mu2]]
d1=(x11-mu1)^2+(x21-mu2)^2
#second column
d2=(x12-mu1)^2+(x22-mu2)^2
# so on
因此可以在大小为 3*1:
的矩阵 [d1,d2,d3]
中对距离进行评分
我可以计算较小矩阵的距离。但是如果矩阵 A
比大小 2*100
大,如何轻松获得所有距离数(即大小为 100*1
的矩阵?
您可以使用逐点减法,然后对两列进行平方和求和:
>>> np.sum((A-b)**2, 1)
如 @Gilad Green 所述,如果 b
的形状为 (n, 1)
,则需要转置:
在 b
:
>>> np.sum((A-b.T)**2, 1)
或 A
(注意 axis=0
上的总和)
>>> np.sum((A.T-b)**2, 0)
>>> A = np.random.rand(3,2)
>>> b = np.random.rand(2)
>>> A - b
array([[0.21263611, 0.47988496],
[0.91061396, 0.93371001],
[0.66321026, 0.21926392]])
>>> (A - b)**2
array([[0.04521411, 0.23028957],
[0.82921779, 0.87181438],
[0.43984785, 0.04807667]])
>>> np.sum((A-b)**2, 1)
array([0.27550369, 1.70103217, 0.48792451])
对于Euclidean distance,您可以使用以下任一方法:
In [1]: import numpy as np
In [2]: A = np.random.rand(3, 2)
In [3]: b = np.random.rand(2)
In [4]: Ab = A - b
In [5]: Ab.shape
Out[5]: (3, 2)
In [6]: A
Out[6]:
array([[0.88888598, 0.71558933],
[0.42653942, 0.80202214],
[0.37195937, 0.24403248]])
In [7]: b
Out[7]: array([0.13348342, 0.91007169])
In [8]: Ab
Out[8]:
array([[ 0.75540256, -0.19448237],
[ 0.293056 , -0.10804955],
[ 0.23847595, -0.66603921]])
In [9]: np.sqrt(np.sum(Ab**2, axis=1))
Out[9]: array([0.78003617, 0.3123404 , 0.70744541])
In [10]: np.linalg.norm(Ab, axis=1)
Out[10]: array([0.78003617, 0.3123404 , 0.70744541])
在python中,给定一个大小为2*3
的矩阵
A=[[x11,x12,x13],[x21,x22,x23]]
和一个列向量 b=[mu1;mu2]
。如果我想计算 A
和向量 b
的每一列之间的欧氏距离。例如,对于第一列,距离“d1”由
A=[[x11,x12,x13],[x21,x22,x23]]
b=[[mu1],[mu2]]
d1=(x11-mu1)^2+(x21-mu2)^2
#second column
d2=(x12-mu1)^2+(x22-mu2)^2
# so on
因此可以在大小为 3*1:
[d1,d2,d3]
中对距离进行评分
我可以计算较小矩阵的距离。但是如果矩阵 A
比大小 2*100
大,如何轻松获得所有距离数(即大小为 100*1
的矩阵?
您可以使用逐点减法,然后对两列进行平方和求和:
>>> np.sum((A-b)**2, 1)
如 @Gilad Green 所述,如果 b
的形状为 (n, 1)
,则需要转置:
在 b
:
>>> np.sum((A-b.T)**2, 1)
或 A
(注意 axis=0
上的总和)
>>> np.sum((A.T-b)**2, 0)
>>> A = np.random.rand(3,2)
>>> b = np.random.rand(2)
>>> A - b
array([[0.21263611, 0.47988496],
[0.91061396, 0.93371001],
[0.66321026, 0.21926392]])
>>> (A - b)**2
array([[0.04521411, 0.23028957],
[0.82921779, 0.87181438],
[0.43984785, 0.04807667]])
>>> np.sum((A-b)**2, 1)
array([0.27550369, 1.70103217, 0.48792451])
对于Euclidean distance,您可以使用以下任一方法:
In [1]: import numpy as np
In [2]: A = np.random.rand(3, 2)
In [3]: b = np.random.rand(2)
In [4]: Ab = A - b
In [5]: Ab.shape
Out[5]: (3, 2)
In [6]: A
Out[6]:
array([[0.88888598, 0.71558933],
[0.42653942, 0.80202214],
[0.37195937, 0.24403248]])
In [7]: b
Out[7]: array([0.13348342, 0.91007169])
In [8]: Ab
Out[8]:
array([[ 0.75540256, -0.19448237],
[ 0.293056 , -0.10804955],
[ 0.23847595, -0.66603921]])
In [9]: np.sqrt(np.sum(Ab**2, axis=1))
Out[9]: array([0.78003617, 0.3123404 , 0.70744541])
In [10]: np.linalg.norm(Ab, axis=1)
Out[10]: array([0.78003617, 0.3123404 , 0.70744541])