dist

paddle.fluid.layers.linalg.dist(x, y, p=2)

该OP用于计算 (x-y) 的 p 范数(p-norm),需要注意这不是严格意义上的范数,仅作为距离的度量。输入 x 和 y 的形状(shape)必须是可广播的(broadcastable)。其含义如下,详情请参考 numpy的广播概念

  • 每个输入都至少有1维
  • 对两个输入的维度从后向前匹配,两个输入每一维的大小需要满足3个条件中的任意一个:相等、其中一个为1或者其中一个不存在。

定义 z = x - y ,x 和 y 的形状是可广播的,那么 z 的形状可按照下列步骤得到:

  1. 如果 x 和 y 的维数不同,先对维数较少的这个输入的维度往前补1。

例如,x 的形状为[8, 1, 6, 1],y 的形状为[7, 1, 5],对 y 的维度补1,

x (4-D Tensor): 8 x 1 x 6 x 1

y (4-D Tensor): 1 x 7 x 1 x 5

  1. 确定输出 z 每一维度的大小:从两个输入的维度中选取最大值。

z (4-D Tensor): 8 x 7 x 6 x 5

若两个输入的维数相同,则输出的大小可直接用步骤2确定。以下是 p 取不同值时,范数的计算公式:

当 p = 0 ,定义

dist - 图1

00\=0,则 z 的零范数是 z 中非零元素的个数。

dist - 图2

当 p = inf ,z 的无穷范数是 z 所有元素中的最大值。

dist - 图3

当 p = -inf ,z 的负无穷范数是 z 所有元素中的最小值。

dist - 图4

其他情况下,z 的 p 范数使用以下公式计算:

dist - 图5

参数

  • x (Variable): 1-D 到 6-D Tensor,数据类型为float32或float64。
  • y (Variable): 1-D 到 6-D Tensor,数据类型为float32或float64。
  • p (float, optional): 用于设置需要计算的范数,数据类型为float32或float64。默认值为2.

返回

(x-y) 的 p 范数。

返回类型

Variable

代码示例

  1. import paddle
  2. import paddle.fluid as fluid
  3. import numpy as np
  4. with fluid.dygraph.guard():
  5. x = fluid.dygraph.to_variable(np.array([[3, 3],[3, 3]]).astype(np.float32))
  6. y = fluid.dygraph.to_variable(np.array([[3, 3],[3, 1]]).astype(np.float32))
  7. out = fluid.layers.dist(x, y, 0)
  8. print(out.numpy()) # out = [1.]
  9. out = fluid.layers.dist(x, y, 2)
  10. print(out.numpy()) # out = [2.]
  11. out = fluid.layers.dist(x, y, float("inf"))
  12. print(out.numpy()) # out = [2.]
  13. out = fluid.layers.dist(x, y, float("-inf"))
  14. print(out.numpy()) # out = [0.]