首页 > 解决方案 > 计算矩阵序列中的成对距离

问题描述

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

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

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

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

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)

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

标签: pythontensorflow

解决方案


我发现,只需将距离矩阵的计算包装到一个函数中,然后使用 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)

推荐阅读