我有n个向量,每个向量都有m个元素(实数)。我想找到所有对中余弦相似度最大的对。
直接的解决方案需要O(n 2 m)时间。
有没有更好的解决方案?
更新
Cosine similarity / distance and triangle equation激励我,我可以将“余弦相似度”替换为“和弦长度” 失去精确度但却提高了速度。 (有很多现有的解决方案解决度量空间中的最近邻,如ANN)
答案 0 :(得分:12)
余弦相似度sim(a,b)
为related to Euclidean distance |a - b|
|a - b|² = 2(1 - sim(a,b))
表示单位向量a
和b
。
这意味着当欧几里德距离在通过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')