【问题标题】:Computing pairwise distances in a sequence of matrices计算矩阵序列中的成对距离
【发布时间】:2019-05-10 20:57:27
【问题描述】:

我正在建立一个循环神经网络,其中我有一个时间序列的特征向量 (N x D),其中 N 列中的每一列对应一个“事件”。我在另一个 N x 3 矩阵中得到了事件坐标的演变。我想构建一个事件图,而不是仅仅为网络提供一个 (N x D + 3) 矩阵,以便也利用 Graph Convolutions。因此,如果我有一个长度为 t 的时间序列,我正在处理维度 t x N x D 以及 t x N x 3 的输入,因为单个“事件”的特征和坐标都在演变。

对于单事件分类的情况,我已经构建了一种方法来构造 N 个事件坐标的密集邻接矩阵。这涉及计算 N 个坐标中每个坐标的成对距离并应用高斯核。

更准确地说,我根据本题的answer得到距离矩阵。但是,我无法弄清楚如何将这种方法推广到一个设置,在该设置中,我没有不同的 N x D 坐标系而不迭代那些(这将太昂贵)。

这是我目前用来获取给定坐标的距离矩阵的 tensorflow 代码。

coordinate_norms = tf.reduce_sum(coordinates * coordinates, 1)
coordinate_norms = tf.reshape(coordinate_norms, [-1, 1])
distances = coordinate_norms - 2 * tf.matmul(coordinates, tf.transpose(coordinates)) + tf.transpose(coordinate_norms)

如果我在这里简单地使用方法,张量维度是不正确的。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    我发现,只需将距离矩阵的计算包装到一个函数中,然后使用 tf.map_fn 沿着输入张量的所需轴映射它就可以轻松完成。

    def calculate_distance(coordiantes):
       coordinate_norms = tf.reduce_sum(coordinates * coordinates, 1)
       coordinate_norms = tf.reshape(coordinate_norms, [-1, 1])
       distances = coordinate_norms - 2 * tf.matmul(coordinates, tf.transpose(coordinates)) + tf.transpose(coordinate_norms)
    
    d = tf.map_fn(calculate_distance, X)
    

    【讨论】: