我有一个1d向量,想要根据TensorFlow中矢量的成对比较生成矩阵 . 我需要将向量中的每个元素与所有其他元素(包括其自身)进行比较,如果它们相同,则相应的矩阵值将为1,否则为-1 . 例如,有一个 [1,2,3,4,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中生成这样的矩阵 .
在NumPy中,我不是一个非常直截了当的方法 . 它的工作原理是获取元素的所有产品,并选择两个元素 x 和 y 的乘积等于 x ** 2.0 的位置 .
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 将如下所示:
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]])
这是一个简单的方法:
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)
要计算成对运算,您可以执行以下技巧:将向量展开为两个二维向量: [n, 1] 和 [1, n] ,并将op应用于它们 . 由于广播,它将产生 [n, n] 矩阵,其中填充了向量内所有对的op结果 .
[n, 1]
[1, n]
[n, n]
在您的情况下,op是比较,但它可以是任何二进制操作 .
为了说明,这里有两个单行 . 第一个产生布尔成对矩阵,第二个产生 -1 和 1 (你问的是什么)的矩阵 .
-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 时,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)
输出是一样的:
3 回答
在NumPy中,我不是一个非常直截了当的方法 . 它的工作原理是获取元素的所有产品,并选择两个元素
x
和y
的乘积等于x ** 2.0
的位置 .给出一个矢量
你可以通过这样做构建你想要的“相似性”矩阵:
sim
将如下所示:这是一个简单的方法:
想法
要计算成对运算,您可以执行以下技巧:将向量展开为两个二维向量:
[n, 1]
和[1, n]
,并将op应用于它们 . 由于广播,它将产生[n, n]
矩阵,其中填充了向量内所有对的op结果 .在您的情况下,op是比较,但它可以是任何二进制操作 .
Tensorflow
为了说明,这里有两个单行 . 第一个产生布尔成对矩阵,第二个产生
-1
和1
(你问的是什么)的矩阵 .结果:
Numpy
使用
np.where
时,numpy中的相同更简单:输出是一样的: