我正在写一个聚类算法,其中一部分我为每一个点簇计算一个欧几里德距离矩阵。(仅供参考,所有这些都在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)
结果矩阵可能如下所示(注意:这是一个距离平方矩阵):
^{pr2}$对于输入矩阵:
[[2,3],[4,5],[1,4],[5,6]]
最后我想得到的是每行的第二个最小值,在本例中是2,2,2和2。另外,如果有一个更好的方法来计算一个簇中每个点到张量流中最近邻点的距离,这将是非常有用的。在
要在TF中找到第k个元素,您需要tf.nn.top_k。如果需要最小值,则不在
X
中搜索,而是在-X
中搜索。在在你的情况下,你甚至不需要它。如果你的矩阵是一个距离,对角线总是0,这会给你带来麻烦。所以只要用tf.matrix_set_diag创建改变矩阵的对角线,其中对角线是X大小的向量,其中每个值是tf.reduce_max。在
为此编写代码很简单。在
相关问题 更多 >
编程相关推荐