首页 文章

在TensorFlow中从单个向量的成对比较生成矩阵

提问于
浏览
3

我有一个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中生成这样的矩阵 .

3 回答

  • 1

    在NumPy中,我不是一个非常直截了当的方法 . 它的工作原理是获取元素的所有产品,并选择两个元素 xy 的乘积等于 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]])
    
  • 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)
    
  • 0

    想法

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

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

    Tensorflow

    为了说明,这里有两个单行 . 第一个产生布尔成对矩阵,第二个产生 -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 时,numpy中的相同更简单:

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

相关问题