在TensorFlow中从单个向量的成对比较生成矩阵

时间:2018-03-16 20:40:24

标签: python numpy matrix tensorflow pairwise

我有一个1d向量,想要根据TensorFlow中向量的成对比较生成矩阵。我需要将向量中的每个元素与所有其他元素(包括其自身)进行比较,如果它们相同,则相应的矩阵值将为1,否则为-1。例如,有一个[1,2,3,4,1]的向量,则所需的矩阵是

[[1,-1,-1,-1,1],
 [-1,1,-1,-1,-1],
 [-1,-1,1,-1,-1],
 [-1,-1,-1,1,-1],
 [1,-1,-1,-1,1]].

问题是如何在TensorFlow中生成这样的矩阵。

3 个答案:

答案 0 :(得分:1)

我不知道TensorFlow是否有类似内置的东西,但在NumPy中有一个非常简单的方法。它的工作原理是获取元素的所有产品,并选择两个元素xy的乘积等于x ** 2.0的位置。

给出一个向量

v = np.array((1, 2, 3, 4, 1)).reshape(-1, 1) # shape == (5, 1)

你可以构建"相似性"你想做的矩阵:

sim = np.where(v.dot(v.T) == np.square(v), 1, -1)

sim看起来像这样:

array([[ 1, -1, -1, -1,  1],
       [-1,  1, -1, -1, -1],
       [-1, -1,  1, -1, -1],
       [-1, -1, -1,  1, -1],
       [ 1, -1, -1, -1,  1]])

答案 1 :(得分:0)

要计算成对运算,您可以执行以下操作:将向量展开为两个二维向量:[n, 1][1, n],并将op应用于它们。由于广播,它将产生[n, n]矩阵,其中填充了向量内所有对的运算结果。

在您的情况下,op是比较,但它可以是任何二进制操作。

Tensorflow

为了说明,这里有两个单行。第一个生成布尔成对矩阵,第二个生成-11(你问的)矩阵。

import tensorflow as tf

tf.InteractiveSession()
v = tf.constant([1, 2, 3, 4, 1])

x = tf.equal(v[:, tf.newaxis], v[tf.newaxis, :])
print(x.eval())

x = 1 - 2 * tf.cast(x, tf.float32)
print(x.eval())

结果:

[[ True False False False  True]
 [False  True False False False]
 [False False  True False False]
 [False False False  True False]
 [ True False False False  True]]
[[ 1 -1 -1 -1  1]
 [-1  1 -1 -1 -1]
 [-1 -1  1 -1 -1]
 [-1 -1 -1  1 -1]
 [ 1 -1 -1 -1  1]]

numpy的

使用np.where

时,numpy更简单
import numpy as np

v = np.array([1, 2, 3, 4, 1])

x = v[:, np.newaxis] == v[np.newaxis, :]
print(x)

x = np.where(x, 1, -1)
print(x)

输出相同:

[[ True False False False  True]
 [False  True False False False]
 [False False  True False False]
 [False False False  True False]
 [ True False False False  True]]
[[ 1 -1 -1 -1  1]
 [-1  1 -1 -1 -1]
 [-1 -1  1 -1 -1]
 [-1 -1 -1  1 -1]
 [ 1 -1 -1 -1  1]]

答案 2 :(得分:0)

这是一种简单的方法:

In [123]: x = tf.placeholder(tf.float32, shape=(1, 5))

In [124]: z = tf.equal(tf.matmul(tf.transpose(x), x), tf.square(x))

In [125]: y = 2 * tf.cast(z, tf.int32) - 1

In [126]: sess = tf.Session()

In [127]: sess.run(y, feed_dict={x: np.array([1, 2, 3, 4, 1])[None, :]})
Out[127]: 
array([[ 1, -1, -1, -1,  1],
       [-1,  1, -1, -1, -1],
       [-1, -1,  1, -1, -1],
       [-1, -1, -1,  1, -1],
       [ 1, -1, -1, -1,  1]], dtype=int32)