在一组向量中找到最佳余弦相似度
Posted
技术标签:
【中文标题】在一组向量中找到最佳余弦相似度【英文标题】:Finding the best cosine similarity in a set of vectors 【发布时间】:2012-11-19 15:04:21 【问题描述】:我有 n 个向量,每个向量都有 m 个元素(实数)。我想找到所有对中余弦相似度最大的对。
直接的解决方案需要 O(n2m) 时间。
有没有更好的解决方案?
更新
Cosine similarity / distance and triangle equation 启发我可以用“弦长”代替“余弦相似度” 失去精度,但提高了很多速度。 (有很多解决度量空间最近邻的现有解决方案,如ANN)
【问题讨论】:
@hs3180 你的向量元素有什么限制吗?例如。它们总是二进制(0 或 1)吗? @robmayoff 不,元素是真实的(浮动) @robmayoff 如果元素是二进制的,这个问题就相当于找到一对01字符串中位数最多的。 【参考方案1】:余弦相似度sim(a,b)
是related to Euclidean distance |a - b|
by
|a - b|² = 2(1 - sim(a,b))
对于单位向量a
和b
。
也就是说,在经过L2范数归一化后欧几里得距离最小时余弦相似度最大,问题归约到closest pair of points problem,可以在O(n lg n)时间内解决。
【讨论】:
很好的答案!给出余弦相似度和欧几里得距离之间的明确关系。 漂亮的答案!【参考方案2】:您可以查看项目 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')
【讨论】:
以上是关于在一组向量中找到最佳余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章