余弦相似度衡量的是2个向量间的夹角大小,通过夹角的余弦值表示结果,因此2个向量的余弦相似度为:
分子为向量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,不一样的相似度低