在一组向量中找到最佳余弦相似度

时间:2012-12-01 16:39:03

标签: algorithm math cosine-similarity

我有n个向量,每个向量都有m个元素(实数)。我想找到所有对中余弦相似度最大的对。

直接的解决方案需要O(n 2 m)时间。

有没有更好的解决方案?

更新

Cosine similarity / distance and triangle equation激励我,我可以将“余弦相似度”替换为“和弦长度”  失去精确度但却提高了速度。 (有很多现有的解决方案解决度量空间中的最近邻,如ANN

2 个答案:

答案 0 :(得分:12)

余弦相似度sim(a,b)related to Euclidean distance |a - b|

|a - b|² = 2(1 - sim(a,b))

表示单位向量ab

这意味着当欧几里德距离在通过L2范数归一化后最小时,余弦相似性最大,并且问题减少到closest pair of points problem,这可以在O(n lg n)时间内求解。

答案 1 :(得分:0)

您可以使用项目simbase https://github.com/guokr/simbase进行检查,它是一个矢量相似性nosql数据库。

Simbase使用以下概念:

  • 矢量集:一组矢量
  • 基础:向量的基础,一个向量集中的向量具有相同的基础
  • 建议:具有相同基础的两个向量集之间的单向二元关系

您可以直接将redis-cli用于管理任务,也可以直接以编程方式使用不同语言的redis客户端绑定。这是一个Python示例

    import redis

    dest = redis.Redis(host='localhost', port=7654)
    schema = ['a', 'b', 'c']
    dest.execute_command('bmk', 'ba', *schema)
    dest.execute_command('vmk', 'ba', 'va')
    dest.execute_command('rmk', 'va', 'va', 'cosinesq')