2017-04-11 5 views
5

Ich habe zwei normierte Tensoren und muss die Kosinusähnlichkeit zwischen diesen Tensoren berechnen. Wie mache ich das mit TensorFlow?Wie berechnet man die Cosinus-Ähnlichkeit zwischen zwei Tensoren?

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) 

Antwort

9

Dies wird die Arbeit machen:

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

Dieser druckt 0.99999988

+0

Ihnen für Ihre Antwort viel Dank. Wird die Cosinus-Ähnlichkeitsformel vereinfacht, indem zuerst die Eingaben normiert werden? Ihre Formel scheint weniger Dinge zu haben als die aus Wikipedia https://en.wikipedia.org/wiki/Cosine_similarity – Matias

+3

Wenn Sie nicht zuerst normalisieren, dann nachdem Sie das innere Produkt a * b berechnet haben, müssen Sie durch das Produkt dividieren der Normen von a und b. Wenn Sie jedoch im Voraus normalisieren, müssen Sie dies nicht tun. Dies liegt daran, dass normalize_a = a/|| a || ist (und ähnlich für b). –

+0

warum nicht Matmul? –

10

Wechselzeiten. Mit der neuesten TF-API kann dies durch Aufruf von tf.losses.cosine_distance berechnet werden.

Beispiel:

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

Natürlich 1 - s ist der Kosinus Ähnlichkeit!

+0

Warum ist 1-s die Kosinusähnlichkeit? –

+2

weil '' 's''' die Cosinus-Entfernung ist, nicht die Ähnlichkeit. –

+0

Das '' '1-s''' wird nicht benötigt. Die Funktion heißt Abstand, gibt aber Ähnlichkeit zurück. Ich denke, weil es in den Verlusten ist. Schau dir den Code an, ich könnte falsch liegen. Zeile 274. Verluste = 1 - math_ops.reduce_sum (Radial_Diffs, Achse = (Dim,), Keep_Dims = True) https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/python/ops/losses/ verluste_impl.py –

0

Sie können Sie Vektor oder eine Matrix wie folgt normalisieren:

[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) 
Verwandte Themen