听起来您需要余弦相似度度量:
similarity = cos(v1, v2) = v1 * v2 / (|v1| |v2|)
和v1 * v2
之间的点积在哪里:v1
v2
v1 * v2 = v1[1]*v2[1] + v1[2]*v2[2] + ... + v1[n]*v2[n]
本质上,点积显示两个向量中有多少元素在同一位置具有 1:如果v1[k] == 1
和v2[k] == 1
,则最终总和(因此相似性)增加,否则不会改变。
您可以使用点积本身,但有时您希望将最终相似度归一化,例如介于 0 和 1 之间。在这种情况下,您可以将v1
和的点积除以v2
它们的长度 -|v1|
和|v2|
。本质上,向量长度是向量与自身的点积的平方根:
|v| = sqrt(v[1]*v[1] + v[2]*v[2] + ... + v[n]*v[n])
有了所有这些,就很容易实现余弦距离,如下所示(Python 中的示例):
from math import sqrt
def dot(v1, v2):
return sum(x*y for x, y in zip(v1, v2))
def length(v):
return sqrt(dot(v, v))
def sim(v1, v2):
return dot(v1, v2) / (length(v1) * length(v2))
请注意,我描述的是相似性(两个向量彼此接近多少),而不是距离(它们有多远)。如果您需要精确的距离,您可以将其计算为dist = 1 / sim
。