我想知道如何计算这两个向量的余弦相似度。
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个字的查询
长度是指字数吗?还是我必须对向量进行 "归一化"?我不确定,因为根据我的理解,余弦已经对向量进行了归一化。
任何帮助和提示都将被感激。
矢量运算是在矢量空间的元素上定义的(其维度需要预先定义)。
所以,即使我们松散地使用术语 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)
- 因为猫出现一次,所以D中出现两次,以此类推。
同理。vec(Q) = (1, 1, 1, 0, 0)
- 请注意,0对应的是不存在的术语,例如,术语 the
.
余弦相似度是归一化的内积。
分母是简单的 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