2017-07-16 37 views
1

我正在写一个聚类算法,对于其中的一部分,我计算了每个聚类点的欧几里得距离矩阵。 (仅供参考,所有这些都在Tensorflow中)。每个聚类都是一个8维向量的列表,然后我变成一个M * 8矩阵。对于每个群集中的每个点,我想找到它与其最近的邻居之间的距离。我相信最有效的方法是计算每个簇的点之间的成对距离,然后在得到的M×M矩阵的每一行中找到第二小的值(因为每一行中的最小值总是0,给定点与其自身之间的距离)。如何找到tensorflow数组中的第二低值

下面是我用它来创建每个群集的欧氏距离矩阵代码:

partitionedData = tf.dynamic_partition(inputs, pred, num_classes) 
    for partition in partitionedData: 
     N = tf.to_int32(partition.get_shape()[0]) 
     qexpand = tf.expand_dims(partition,1) 
     qTexpand = tf.expand_dims(partition,0) 
     qtile = tf.tile(qexpand,[1,N,1]) 
     qTtile = tf.tile(qTexpand,[N,1,1]) 
     deltaQ = qtile - qTtile 
     deltaQ2 = deltaQ*deltaQ 
     d2Q = tf.reduce_sum(deltaQ2,2) 

所产生的基质可能看起来像这样(注:这是距离的平方的矩阵):

[[ 0. 8. 2. 18.] 
[ 8. 0. 10. 2.] 
[ 2. 10. 0. 20.] 
[ 18. 2. 20. 0.]] 

为输入矩阵:

[[2,3],[4,5],[1,4],[5,6]] 

我想在日获得e end是每行中第二小的值,在这种情况下是2,2,2和2.此外,如果有一种更好的方法来计算集群中每个点的张量流中最近邻居的距离高效,这将是非常有益的。

回答

0

要在TF中查找第k个元素,您需要tf.nn.top_k。如果你需要的最小,你不搜索X,但在-X

在你的情况下,你甚至不需要它。如果你的矩阵是一个距离,对角线总是为0,这就为你搞定了一些东西。因此,只需创建一个对角线,使用tf.matrix_set_diag即可,其中对角线是X的大小的向量,其中每个值为tf.reduce_max

为此编写代码很简单。

+0

谢谢,这是有道理的。 tf.matrix_set_diag函数正是我所需要的。这应该使它非常简单。 –

相关问题