包含(浮点数,整数)元组的100万个向量的有效比较

时间:2010-02-22 12:45:05

标签: database algorithm math comparison performance

我正在从事化学/生物学项目。我们正在构建一个Web应用程序,用于将用户的实验数据与参考数据库中的预测数据快速匹配。参考数据库将包含多达一百万个条目。一个条目的数据是元组的列表(向量),其中浮点值介于0.0和20.0之间,整数值介于1和18之间。例如(7.2394,2),(7.4011,1),(9.9367,3), ...等 用户将输入一个类似的元组列表,然后web-app必须返回 - 比方说 - 前50个最匹配的数据库条目。

有一件事是至关重要的:搜索算法必须考虑查询数据和参考数据之间的差异,因为两者都可能包含浮点值中的小错误(不是整数值)。(查询数据可能包含错误,因为它来自现实生活实验和参考数据,因为它是预测的结果。)

编辑 - 移动文字回答 -

如何在100万条记录中获得1个查询的有效排名?

5 个答案:

答案 0 :(得分:2)

对这种类型的100万条记录进行有效的线性扫描,在现代机器上只需要几分之一秒;一个编译好的循环应该能够在大约内存带宽下完成它,这将在两到三毫秒内传输。

但是,如果你真的需要优化它,你可以构造一个整数值的哈希表,它将作业除以整数二进制数。并且,如果数据按浮点数排序存储,则可以改善匹配的位置;你知道一旦你超出容忍范围就可以停止。存储多个箱子中的每个箱子的偏移量将使您有机会开始。

我想我还没有看到需要一个花哨的算法......或许更多地描述问题(如果你愿意的话,你可以假设一个相当高水平的化学和物理知识;我是一个物理学家通过培训)?

好的,鉴于额外的信息,我仍然认为没有比直接线性搜索更好的东西,如果只有100万个参考向量并且算法那么简单。我只是尝试过,即使是线性扫描的纯Python实现也只用了大约三秒钟。花了几倍的时间来组成一些随机数据进行测试。这在某种程度上取决于Python的排序库中相当疯狂的优化级别,但这是高级语言的优势。

from cmath import *
import random
r = [(random.uniform(0,20), random.randint(1,18)) for i in range(1000000)]
# this is a decorate-sort-undecorate pattern
# look for matches to (7,9)
# obviously, you can use whatever distance expression you want
zz=[(abs((7-x)+(9-y)),x,y) for x,y in r]
zz.sort()
# return the 50 best matches
[(x,y) for a,x,y in zz[:50]]

答案 1 :(得分:2)

您应该为项目添加物理学家:-)这是比较函数的一个非常常见的问题,例如看这里:

在第一个链接中,您可以阅读:“用于分析质谱的SEQUEST算法利用自相关和交叉相关来评估观察到的光谱与代表肽的理想光谱的相似性。

答案 2 :(得分:1)

你不能对元组进行排序并对已排序的数组执行二进制搜索吗? 我假设您的数据库已经完成了一次,并且条目的位置并不重要。您可以对此数组进行排序,以便元组按给定顺序排列。当用户输入元组时,您只需查看已排序数组的中间位置。如果查询值大于中心值,则重复上半部分的工作,否则重复下部工作。

最坏的情况是log(n)

答案 3 :(得分:0)

如果您可以将参考数据“映射”到平面上的x-y坐标,则可以使用一种漂亮的技术来选择给定距离/容差下的所有点(使用希尔伯特曲线)。

这是detailed example

答案 4 :(得分:0)

我们自己尝试的一种方法允许查询和引用之间的差异是通过对浮点值进行分级。我们正在测试并希望为用户提供不同箱尺寸的选择。箱尺寸为0.1,0.2,0.3或0.4。因此binning为我们留下了50到200个bin,每个bin都有一个0到18之间的对应整数值,其中0表示该bin中没有值。参考数据可以预先装箱并存储在数据库中。然后我们可以获取分箱查询数据并将其与参考数据进行比较。一种方法可以是所有箱,从参考整数值中减去查询整数值。通过总结所有差异,我们得到相似性得分,最相似的参考条目得到最低分数。

我们想要提供的另一个(更简单的)搜索选项是用户只输入浮点值。然后可以将查询作为引用列表中的整数值设置为1.然后,我们使用汉明距离来计算查询与参考分箱值之间的差异。 I have previously asked about an efficient algorithm for that search.

此分档只是实现目标的一种方式。我对其他建议持开放态度。也许我们可以使用主成分分析(PCA),如here

所述