【问题标题】: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字符串中位数最多的。

标签: algorithm math cosine-similarity


【解决方案1】:

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

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

对于单位向量ab

也就是说,在经过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')

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2017-09-27
    • 1970-01-01
    • 2020-12-20
    • 2020-08-12
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多