我有n个向量,每个向量有m个元素(实数)。我想找到所有对之间的余弦相似度最大的对。
直接的解决方案将需要O(n 2 m)时间。
有没有更好的解决方案?
更新
余弦相似度/距离和三角形方程式启发我,我可以用“弦长”代替“余弦相似度”,这会降低精度,但会大大提高速度。(有许多解决公制空间中最近邻居的解决方案,例如ANN)
余弦相似度sim(a,b)是与欧几里得距离 |a - b|由
sim(a,b)
|a - b|
|a - b|² = 2(1 - sim(a,b))
用于单位向量a和b。
a
b
这意味着当以L2范数归一化后,当欧几里得距离最小时,余弦相似度最大,并且问题简化为最接近的一对点问题,可以在O(n lg n)时间内解决。