如何计算两个张量之间的余弦相似度?

Mat*_*ias 11 python neural-network tensorflow

我有两个归一化张量,我需要计算这些张量之间的余弦相似度.如何使用TensorFlow进行操作?

cosine(normalize_a,normalize_b)

    a = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_a")
    b = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_b")
    normalize_a = tf.nn.l2_normalize(a,0)        
    normalize_b = tf.nn.l2_normalize(b,0)
Run Code Online (Sandbox Code Playgroud)

Raj*_*tra 23

时代在变.使用最新的TF API,可以通过调用来计算tf.losses.cosine_distance.

例:

import tensorflow as tf
import numpy as np


x = tf.constant(np.random.uniform(-1, 1, 10)) 
y = tf.constant(np.random.uniform(-1, 1, 10))
s = tf.losses.cosine_distance(tf.nn.l2_normalize(x, 0), tf.nn.l2_normalize(y, 0), dim=0)
print(tf.Session().run(s))
Run Code Online (Sandbox Code Playgroud)

当然,1 - s余弦相似!

  • 因为``s```是余弦距离,而不是相似性. (3认同)
  • @RajarsheeMitra可以为整个矩阵完成吗?意味着矢量"v"与矩阵中所有行之间的余弦距离,假设每一行都是与"v"相同维度的向量? (2认同)

Mir*_*ber 21

这将完成工作:

a = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_a")
b = tf.placeholder(tf.float32, shape=[None], name="input_placeholder_b")
normalize_a = tf.nn.l2_normalize(a,0)        
normalize_b = tf.nn.l2_normalize(b,0)
cos_similarity=tf.reduce_sum(tf.multiply(normalize_a,normalize_b))
sess=tf.Session()
cos_sim=sess.run(cos_similarity,feed_dict={a:[1,2,3],b:[2,4,6]})
Run Code Online (Sandbox Code Playgroud)

这打印 0.99999988

  • 如果您不首先进行标准化,那么在计算内积a*b后,您必须除以a和b的范数的乘积.但是,如果您提前规范化,则不需要这样做.这是因为normalize_a = a/|| a || (同样适用于b). (3认同)