2017-04-11 13 views
5

Mam dwa znormalizowane tensory i muszę obliczyć podobieństwo cosinusa między tymi tensorami. Jak to zrobić z TensorFlow?Jak obliczyć podobieństwo Cosinusa między dwoma tensorami?

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) 

Odpowiedz

9

To będzie wykonać zadanie:

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

Drukuje 0.99999988

+0

Dziękuję dużo za odpowiedź. Czy upraszcza się formułę podobieństwa cosinusa, normalizując najpierw dane wejściowe? Twoja formuła wydaje się mieć mniej rzeczy niż ta z Wikipedii https://en.wikipedia.org/wiki/Cosine_similarity – Matias

+3

Jeśli nie będziesz normalizował pierwszy, to po obliczeniu wewnętrznego produktu a * b musisz podzielić przez produkt norm a i b. Jeśli jednak normalizujesz się z góry, nie musisz tego robić. Wynika to z faktu, że normalize_a = a/|| a || (i podobnie dla b). –

+0

dlaczego nie matmul? –

10

czasy się zmieniają. Dzięki najnowszemu interfejsowi TF API można to obliczyć, dzwoniąc pod numer tf.losses.cosine_distance.

przykład:

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

Oczywiście 1 - s jest podobieństwo cosinus!

+0

dlaczego 1-s jest podobieństwem cosinus? –

+2

ponieważ '' 's''' jest odległością cosinusa, a nie podobieństwem. –

+0

'' '1-s''' nie jest potrzebne. Funkcja nazywa się odległość, ale zwraca podobieństwo. Myślę, że ponieważ jest w tf.losses. Spójrz na kod, mogę się mylić. Linia 274. straty = 1 - math_ops.reduce_sum (radial_diffs, axis = (dim,), keep_dims = True) https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/python/ops/losses/ loss_impl.py –

0

można znormalizować wektor lub macierz ci ​​tak:

[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) 
Powiązane problemy