首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在TensorFlow中通过对单个向量进行成对比较来生成矩阵

在TensorFlow中通过对单个向量进行成对比较来生成矩阵
EN

Stack Overflow用户
提问于 2018-03-17 04:40:24
回答 3查看 1.5K关注 0票数 4

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

代码语言:javascript
运行
复制
[[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中生成这样的矩阵。

EN

回答 3

Stack Overflow用户

发布于 2018-03-17 05:26:21

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

给定一个向量

代码语言:javascript
运行
复制
v = np.array((1, 2, 3, 4, 1)).reshape(-1, 1) # shape == (5, 1)

您可以通过执行以下操作来构建所需的“相似性”矩阵:

代码语言:javascript
运行
复制
sim = np.where(v.dot(v.T) == np.square(v), 1, -1)

sim将如下所示:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-04-19 03:35:41

想法

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

在您的例子中,op是一个比较,但它可以是任何二元运算。

Tensorflow

为了说明,这里有两个一行程序。第一个生成布尔成对矩阵,第二个生成-11的矩阵(如您所要求的)。

代码语言:javascript
运行
复制
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())

结果:

代码语言:javascript
运行
复制
[[ 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中的相同内容甚至更简单

代码语言:javascript
运行
复制
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)

输出是相同的:

代码语言:javascript
运行
复制
[[ 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]]
票数 1
EN

Stack Overflow用户

发布于 2018-04-19 03:59:47

这里有一个简单的方法:

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49329178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档