我正在编写一个聚类算法,对于其中的一部分,我计算了每个点群的欧氏距离矩阵。 (仅供参考,所有这些都在Tensorflow中)。每个簇是8维向量的列表,然后我将其转换为一个M * 8矩阵。对于每个群集中的每个点,我想找到它与其最近邻居之间的距离。我认为最有效的方法是在每个簇的点之间进行计算成对距离,然后在得到的M * M矩阵的每一行中找到第二个最小值(因为每行中的最小值将始终为0,给定点与自身之间的距离。)
以下是我用于为每个群集创建欧几里德距离矩阵的代码:
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]]
我最想得到的是每一行中的第二个最小值,在本例中为2,2,2和2.另外,如果有更好的方法来找到距离最近邻居的距离对于计算效率高的群集中的每个点的张量流,这将非常有用。
答案 0 :(得分:0)
要在TF中找到第k个元素,您需要tf.nn.top_k。如果您需要最小的搜索,则不是X
,而是-X
。
在你的情况下,你根本不需要它。如果你的矩阵是一个距离,对角线总是0,这会为你搞砸。因此,只需使用tf.matrix_set_diag更改矩阵的对角线,其中对角线是X大小的向量,其中每个值都为tf.reduce_max。
为此编写代码是微不足道的。