【问题标题】:Find 10 closest matches of a 30 dimensional vector, what data structure?找到 30 维向量的 10 个最接近的匹配项,什么数据结构?
【发布时间】:2012-12-11 10:20:33
【问题描述】:

我有一个 30 维的向量,我想在我的数据库中找到 10 个最接近的匹配项。我的数据库中有大约 3000 个向量,我必须与之进行比较。有些尺寸比其他尺寸更重要,所以我想给它们单独的权重。

这 30 个维度是由 10 倍的 RGB 值组成的。我将一张图片分成 9 个图块。所以 9 * 3 (RGB) 27。最后三个值是图片平均颜色的 RGB。

我的问题是:如果可以,这是否可能。使此过程尽可能快速和高效的最佳方法是什么?我自己,我在考虑某种树,但是树太多了,我不知道哪一种最适合我的问题。

编辑:

我想我并不完全清楚我想要实现什么。我有一个随机向量,我想将这个向量与我的数据库中的向量进行比较,以找到 10 个已关闭的向量。我有一个包含所有向量的数据库。我已将它们存储在 MySQL DB 中,每一行都是一个向量。见下文

【问题讨论】:

  • 如何在数据库中存储 30 维向量?
  • 以对性能有用的方式将自定义树存储在(关系)数据库中似乎是不可能的。
  • 只有 3000 个?只是蛮力
  • 嘿,30 维向量??如果每个维度只有 length==2,您将在数组中获得大约 1000000000(十亿)个值。也许你的意思是 30 长度的向量,而不是 30 维的?
  • @SergeyS:长度为 30 的向量正好是 30 维向量空间中的一个点,这没什么好奇怪的。

标签: algorithm data-structures tree nearest-neighbor


【解决方案1】:

这个问题类似于当你有太多的时候找到离参考点最近的n个点的问题。

假设您知道如何比较两个向量以找到它们之间的“距离”,您可以为此使用最大堆。使用与随机向量的距离作为比较来自 db 的两个向量的关键。也就是说,

  1. 找出随机向量与数据库中前 10 个向量的距离,并将它们存储在大小为 10 的最大堆中。因此,根将是迄今为止离随机向量最远的向量。
  2. 一一比较并找出从随机向量到所有其他向量的距离。
  3. 对于每次比较,如果找到的距离小于最大堆的根,则从堆中提取最大元素并将最新的向量插入堆中。
  4. 最后,您的堆中将有 10 个最接近的向量。

也就是说,您的问题空间似乎很小。因此,您可以按照 cmets 中的建议使用蛮力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多