【问题标题】:Pairwise Euclidean distances between two binary tensors两个二元张量之间的成对欧几里得距离
【发布时间】:2018-03-28 17:18:52
【问题描述】:

我正在尝试计算 Tensorflow 中两个二进制区域/体积/超体积中所有点之间的成对距离。

例如在 2D 中,这些区域被定义为具有 1 和 0 的二进制张量:

input1 = tf.constant(np.array([[1,0,0], [0,1,0], [0,0,1]))
input2 = tf.constant(np.array([[0,1,0], [0,0,1], [0,1,0]))

input1 有 3 分,input2 有 2 分。

到目前为止,我已经设法将二进制张量转换为空间坐标数组:

coord1 = tf.where(tf.cast(input1, tf.bool))
coord2 = tf.where(tf.cast(input2, tf.bool))

其中,coord1 将具有shape=(3,2),coord2 将具有shape=(2,2)。第一个维度指点的数量,第二个维度指它们的空间坐标(在本例中为 2D)。

我想要的结果是一个带有shape=(6, ) 的张量,以及区域中所有点之间的成对欧几里得距离。 示例(距离的顺序可能不正确):

output = [1, sqrt(5), 1, 1, sqrt(5), 1]

由于 TensorFlow 在循环方面不是很好,而且在我的实际应用中,每个张量中的点数是未知的,我想我可能在这里遗漏了一些线性代数。

【问题讨论】:

    标签: python tensorflow linear-algebra euclidean-distance


    【解决方案1】:

    我不熟悉 Tensorflow,但通过阅读 this 我的理解是,底层 NumPy 数组应该很容易从您的数据中提取。因此,我将提供一个解决方案,展示如何计算 3x2 和 2x2 NumPy 数组的点之间的成对欧几里德距离,希望对您有所帮助。

    生成与数据形状相同的随机 NumPy 数组:

    coord1 = np.random.random((3, 2))
    coord2 = np.random.random((2, 2))
    

    导入相关的SciPy函数并运行:

    from scipy.spatial.distance import cdist
    distances = cdist(coord1, coord2, metric='euclidean')
    

    这将返回一个 3x2 数组,但您可以使用 distances.flatten() 来获得您想要的长度为 6 的一维数组。

    【讨论】:

    • 谢谢,但重点是使用张量而不是使用外部包。我想我已经单独使用矩阵乘法和转置找到了答案。
    • @Miguel 明白了,很遗憾我帮不上忙,很高兴你找到了解决方案。
    【解决方案2】:

    我只使用矩阵乘法和转置得出了一个答案。这利用了距离可以用内积表示的事实(d^2 = x^2 + y^2 - 2xy):

    input1 = np.array([[1,0,0],[0,1,0],[0,0,1]])
    input2 = np.array([[1,1,0],[0,0,1],[1,0,0]])
    c1 = tf.cast(tf.where(tf.cast(input1, tf.bool)), tf.float32)
    c2 = tf.cast(tf.where(tf.cast(input2, tf.bool)), tf.float32)
    
    distances = tf.sqrt(-2 * tf.matmul(c1, tf.transpose(c2)) + tf.reduce_sum(tf.square(c2), axis=1)
                    + tf.expand_dims(tf.reduce_sum(tf.square(c1), axis=1), axis=1))
    
    with tf.Session() as sess:
         d = sess.run(distances)
    

    由于 Tensorflow 默认已广播,因此数组具有不同维度的事实并不重要。

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 2019-06-06
      • 2014-11-12
      • 2019-06-19
      • 2014-03-27
      • 2011-09-05
      • 1970-01-01
      • 2014-06-08
      • 2011-01-29
      相关资源
      最近更新 更多