2017-04-11 63 views
5

私は2つの正規化テンソルを持っており、これらのテンソル間のコサイン類似度を計算する必要があります。 TensorFlowでどうすればいいですか?2つのテンソル間のコサインの類似度を計算するには?

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) 

答えて

9

これは仕事を行います。

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

これは0.99999988

+0

は、あなたの答えのためにあなたにたくさんありがとうございました。入力を正規化することによってコサイン類似度式が単純化されますか?あなたの数式はWikipediaのものよりも少ないようですhttps://en.wikipedia.org/wiki/Cosine_similarity – Matias

+3

最初に正規化しない場合は、内積a * bを計算した後に、 aとbのノルムのただし、事前に正規化を行う場合は、その必要はありません。これは、normalize_a = a/|| a || (bについても同様)。 –

+0

なぜmatmul? –

10

タイムズの変化を出力します。最新の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)) 

1 - sは、コサイン類似度です!あなたはこのように、ベクトルや行列あなたが正常化することができます

+0

なぜコサインの類似度は1ですか? –

+2

であり、 '' 's''は余弦距離であり類似点ではないからです。 –

+0

'' '1-s'''は必要ありません。関数は距離と呼ばれますが、類似点を返します。それはtf.lossesにあるからだと思う。コードを見て、私は間違っている可能性があります。 Line 274. losses = 1 - math_ops.reduce_sum(radial_diffs、axis =(dim、)、keep_dims = True)https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/python/ops/losses/ losses_impl.py –

0

[batch_size*hidden_num] 
states_norm=tf.nn.l2_normalize(states,dim=1) 
[batch_size * embedding_dims] 
embedding_norm=tf.nn.l2_normalize(embedding,dim=1) 
#assert hidden_num == embbeding_dims 
after mat [batch_size*embedding] 
user_app_scores = tf.matmul(states_norm,embedding_norm,transpose_b=True) 
関連する問題