让我们说我有一些大集合的数据,排在一行中的每个元素是一个(键,值)对:分类数据
1) [(bird, "eagle"), (fish, "cod"), ... , (soda, "coke")]
2) [(bird, "lark"), (fish, "bass"), ..., (soda, "pepsi")]
n) ....
n+1) [(bird, "robin"), (fish, "flounder"), ..., (soda, "fanta")]
我想的能力,运行一些可以让我确定新行的计算,那么与这一行“最相似”的行是什么?
我认为找到任何特定行的“最相似”行的最直接方式是直接将所述行与所有其他行进行比较。这显然在计算上非常昂贵。
我正在寻找以下形式的解决方案。
,可以采取一排,并且产生用于该行的一些衍生物的整数的函数。这个返回的整数将是该行的一种“签名”。这个签名的重要属性是,如果两行非常“相似”,它们将生成非常接近的整数,如果行非常“不同”,则它们会生成较远的整数。显然,如果它们是相同的行,它们会生成相同的签名。
然后,我可以将这些生成的签名与它们所指向的行的索引进行匹配,并通过它们的签名对它们进行排序。我将保留这种数据结构,以便我可以快速查找。说它数据库B.
当我有一个新的行,我想知道哪些存在的行中的数据库B是最相似的,我想:
- 生成一个签名为新行
- 通过在数据库B的衣柜比赛
- 返回最匹配的(签名指数)排序列表中的二进制搜索(可能是一个完美的匹配)在数据库B行
我知道他们在这个问题上挥舞着很多手。我的问题是,我实际上不知道该函数会产生这个签名。我看到Levenshtein距离,但这些代表了转换成本,而不是签名。我看到我可以尝试有损压缩,有两件事情可能是“可铲除的”,因为它们压缩到相同的东西。我正在寻找关于如何做到这一点的其他想法。
谢谢。
这是人们一直在说的话,我有种解释,但直觉上我只是没有把握。我的意思是,数据是多维的。但让我们说我将每个值限制在50个字符以内,以便有限数量的可能排列:我不能然后将有限数量的排列映射到(概念上)无限多个整数?道歉,如果它是一种愚蠢的问题。 – 2011-01-23 05:24:57