4

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

4

3 回答 3

1

主意

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

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

张量流

为了说明,这里有两个单行。第一个产生布尔成对矩阵,第二个产生矩阵-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

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]]
于 2018-04-18T19:35:40.850 回答
1

我不知道 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]])
于 2018-03-16T21:26:21.270 回答
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)
于 2018-04-18T19:59:46.550 回答