天天看点

深度学习之RNN①——余弦相似度

文章目录

    • 余弦相似度公式
    • 特征情况分析
    • 相关代码

余弦相似度公式

余弦相似度衡量的是2个向量间的夹角大小,通过夹角的余弦值表示结果,因此2个向量的余弦相似度为:

深度学习之RNN①——余弦相似度

分子为向量A与向量B的点乘,分母为二者各自的L2相乘,即将所有维度值的平方相加后开方。

余弦相似度的取值为[-1,1],值越大表示越相似。

特征情况分析

(1)夹角为0度

此时向量A与向量B应该是最相似的,余弦相似度应该为1。按照公式(4),我们计算很容易计算出来cosθ=1 \cos \theta = 1 cosθ=1。

(2)夹角为90度

此时余弦相似度为0。

(3)夹角为180度

此时余弦相似度为-1,2个向量的方向完全相反。

相关代码

import tensorflow as tf

X1 = tf.constant([[[[1], [2], [3], [4]],
                   [[5], [6], [7], [8]],
                   [[9], [10], [11], [12]]],

                  [[[1], [2], [3], [4]],
                   [[5], [6], [7], [8]],
                   [[9], [10], [11], [12]]]], tf.float32)


X2 = tf.constant([[[[3], [4], [1], [2]],
                   [[5], [7], [8], [6]],
                   [[9], [12], [11], [10]]],

                  [[[1], [2], [3], [4]],
                   [[5], [6], [7], [8]],
                   [[9], [10], [11], [12]]]], tf.float32)
print(X1.shape)
print(X2.shape)

with tf.Session() as sess:
    #求模
    X1_norm = tf.sqrt(tf.reduce_sum(tf.square(X1), axis=2))
    X2_norm = tf.sqrt(tf.reduce_sum(tf.square(X2), axis=2))

    #内积
    X1_X2 = tf.reduce_sum(tf.multiply(X1, X2), axis=2)
    cosin = X1_X2 / (X1_norm * X2_norm)

    a, b, c, d = sess.run([X1_norm, X2_norm, X1_X2, cosin])
    print("A: ", a)
    print("B: ", b)
    print("C: ", c)
    print("D: ", d)

           
A:  [[[ 5.477226]
  [13.190906]
  [21.118711]]

 [[ 5.477226]
  [13.190906]
  [21.118711]]]
B:  [[[ 5.477226]
  [13.190906]
  [21.118711]]

 [[ 5.477226]
  [13.190906]
  [21.118711]]]
C:  [[[ 22.]
  [171.]
  [442.]]

 [[ 30.]
  [174.]
  [446.]]]
D:  [[[0.7333333 ]
  [0.9827587 ]
  [0.99103147]]

 [[0.99999994]
  [1.0000001 ]
  [1.0000001 ]]]

这里可以看到一样的向量相似度就很高为1,不一样的相似度低
           

继续阅读