Python 在TensorFlow中从单个向量上的两两比较生成矩阵

Python 在TensorFlow中从单个向量上的两两比较生成矩阵,python,numpy,matrix,tensorflow,pairwise,Python,Numpy,Matrix,Tensorflow,Pairwise,我有一个一维向量,想根据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中生成这样的矩阵。我不知道TensorFlow是否有类

我有一个一维向量,想根据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中生成这样的矩阵。

我不知道TensorFlow是否有类似的内置元素,但在NumPy中有一种非常简单的方法。它的工作原理是获取元素的所有乘积,并选择两个元素的乘积
x
y
等于
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]])
主意 要计算成对运算,您可以执行以下技巧:将向量展开为两个二维向量:
[n,1]
[1,n]
,并将运算应用于它们。由于广播,它将产生
[n,n]
矩阵,其中填充向量内所有对的运算结果

在您的例子中,op是一种比较,但它可以是任何二进制操作

张量流 为了便于说明,这里有两个一行程序。第一个生成布尔成对矩阵,第二个生成
-1
1
的矩阵(根据您的要求)

将tensorflow导入为tf
tf.InteractiveSession()
v=tf.常数([1,2,3,4,1])
x=tf.equal(v[:,tf.newaxis],v[tf.newaxis,:])
打印(x.eval())
x=1-2*tf.cast(x,tf.float32)
打印(x.eval())
结果:

[[True-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更简单。其中

将numpy导入为np
v=np.数组([1,2,3,4,1])
x=v[:,np.newaxis]==v[np.newaxis,:]
打印(x)
x=np,其中(x,1,-1)
打印(x)
输出相同:

[[True-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]]

这里有一个简单的方法:

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)

实际上我想比较一维向量中的元素。假设向量的长度为5,那么将有25个比较,因此根据每次比较的结果生成一个5x5矩阵。谢谢你的回答,我考虑过生成一个np矩阵,然后将其转换为tensorflow张量。但显然,我不知道如何把np和tf图联系起来。你知道它是如何工作的吗?我不知道,但是看起来你可以直接在TensorFlow中使用这种方法,而不需要将存储在那里的数据转换成数据数组。看,这可能会给你指明正确的方向。也许从你拥有的向量中构造一个
tf.constant
,然后执行我描述的操作,替换
tf.where()
tf.square()
,和
tf.matmul()
。你确定tf.where()和np.where()做同样的事情吗?它似乎做同样的操作,但它可能不允许第二个和第三个参数使用标量。它们可能需要与第一个参数的秩相同的张量。我从来没用过。