我有一个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中生成这样的矩阵。
答案 0 :(得分: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]])
答案 1 :(得分:0)
要计算成对运算,您可以执行以下操作:将向量展开为两个二维向量:[n, 1]
和[1, n]
,并将op应用于它们。由于广播,它将产生[n, n]
矩阵,其中填充了向量内所有对的运算结果。
在您的情况下,op是比较,但它可以是任何二进制操作。
为了说明,这里有两个单行。第一个生成布尔成对矩阵,第二个生成-1
和1
(你问的)矩阵。
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]]
使用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]]
答案 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)