python - 如何找到 tensorflow 数组中的第二低值

标签 python machine-learning tensorflow cluster-analysis

我正在编写一个聚类算法,其中一部分是为每个点簇计算欧几里德距离矩阵。 (仅供引用,所有这些都在 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。此外,如果有更好的方法来找到到最近邻居的距离集群中每个点的 tensorflow 计算效率很高,这将非常有帮助。

最佳答案

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

在你的情况下,你甚至不需要它。如果你的矩阵是一个距离,对角线总是0,这会让你的事情变得糟糕。因此,只需使用 tf.matrix_set_diag 更改矩阵的对角线即可,其中对角线是 X 大小的向量,其中每个值为 tf.reduce_max .

为此编写代码很简单。

关于python - 如何找到 tensorflow 数组中的第二低值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45126061/

相关文章:

python - DataFrame 各列的有效计数不同,按行分组

python - 在 Tensorflow2 中将图卡住为 pb

machine-learning - 如何在tensorflow中构建基于字符的seq2seq模型

machine-learning - 多变量梯度下降的向量化

python - 如何解释 model.predict 返回的结果?

python - 将 tensorflow 1.x.x 模型加载到 tensorflow 2.x.x

python - 向 Django 数据库添加元素

python - python 3 TypeError : '>' not supported between instances of 'int' and 'str' in an if statment

python - 根据 file.txt pandas 中的模式匹配对数据框进行子集化

python - 更新 TensorFlow 中的权重子集