Python 使用 numpy.linalg.norm() 求距离矩阵 --> 如何计算?

Python Using numpy.linalg.norm() to Find Distance Matrix --> How Calculated?

我下面有一个矢量,叫做 vector:

[0.465344 0.519904]

我还有下面的矩阵 matrix_b:

[[-0.701366  0.261183]
 [-0.295642 -1.41441 ]]

我使用下面的代码来计算距离矩阵。

dist_matrix = np.linalg.norm(vector - matrix_b, ord=2, axis=1)

然后我打印出 dist_matrix 以查看输出:

print (dist_matrix )

[1.19505179 2.07862222]

我不明白范数距离(即 dist_matrix)是如何从输入中计算出来的。有没有人可以赐教一下?

>>> vector = np.array([0.465344, 0.519904])
>>> matrix_b = np.array([[-0.701366,  0.261183],[-0.295642, -1.41441 ]])
>>> vector - matrix_b
array([[1.16671 , 0.258721],
       [0.760986, 1.934314]])

做减法,vector被广播成matrix_b的形状。结果的元素因此是

vector[0] - matrix_b[0,0]    vector[1] - matrix_b[0,1]
vector[0] - matrix_b[1,0]    vector[1] - matrix_b[1,1]

然后,

>>> dist_matrix = np.linalg.norm(vector - matrix_b, ord=2, axis=1)
>>> dist_matrix
array([1.19505179, 2.07862222])

参考numpy.linalg.norm的文档,可以看到axis参数指定了计算向量范数的轴。所以在这里,axis=1 意味着将计算矩阵中每行的向量范数。

那么,ord=2 for vector norms 表示对于一个向量x,结果是sum(abs(x)**2)**(1./2)(这也是欧式距离的公式)。

所以,我们有,数学上:

dist_matrix[0] == (abs(vector[0] - matrix_b[0,0])**2 + abs(vector[1] - matrix_b[0,1])**2)**(1./2)
dist_matrix[1] == (abs(vector[0] - matrix_b[1,0])**2 + abs(vector[1] - matrix_b[1,1])**2)**(1./2)