我试图弄清楚如何计算这两个向量的余弦相似度:
A:(1,1,0,0,0,0,0,0,0)
B:(1,0,0,1,0,0,0,0,1)
据我了解,我需要将A
乘以B
,然后除以A*B
的长度。
我了解第一部分,但是我怎么知道长度是多少?
A
是一个包含11个单词的文档
B
是一个包含7个单词的查询
长度是指单词数吗?还是我必须对向量进行“归一化”?我不确定,因为据我所知,余弦已经对向量进行了归一化。
任何帮助和提示将不胜感激。
答案 0 :(得分:0)
向量运算是在向量空间的元素上定义的(必须预先定义其维数)。
因此,即使我们松散地使用术语sparse vector
,也仅是表示dense vector
的有效方法...
对于涉及文本向量的示例-文档和查询都不过是密集向量(维数是整个词汇量的大小)。
第一步是将文档和查询转换为密集的矢量表示形式。
如果D = {<the cat sat on the mat>
和Q = <cat on mat>
,
然后词汇量(一组独特的单词)是{cat,mat,on,sat,the}
因此,我们的玩具向量空间为5维。因此,每个向量都由5个数字表示,其中的值表示相应项的存在/不存在或计数。
vec(D) = (1, 1, 1, 1, 2)
-因为cat发生一次,所以在D中出现两次,依此类推。
类似地,vec(Q) = (1, 1, 1, 0, 0)
-注意与不存在的术语相对应的0,例如术语the
。
余弦相似度是归一化的内积。
分子只是\ sum_i a_i * b_i,在此示例中为
1.1 + 1.1 + 1.1 + 1.0 + 2.0 = 3
长度如何?为了找到向量的长度(特别是L2范数),只需计算其自身的内积,然后取平方根即可。
Len(D) = sqrt(1.1 + 1.1 + 1.1 + 1.1 + 2.2) = 2sqrt(2)
Len(Q) = sqrt(1.1 + 1.1 + 1.1 + 0.0 + 0.0) = sqrt(3)
因此cosine-sim = 3/(2sqrt(2)*sqrt(3))
最后,例如,
A:(1,1,0,0,0,0,0,0,0) and B:(1,0,0,1,0,0,0,0,1),
A.B = 1
Len(A) = sqrt(A.A) = sqrt(2)
Len(B) = sqrt(A.A) = sqrt(3)
cosine-sim = 1/sqrt(6) = 0.4082