在数据集中查找类似记录

时间:2011-02-20 02:18:49

标签: algorithm language-agnostic matching similarity

我有一个包含25个整数字段和40k记录的数据集,例如

1:
  field1: 0
  field2: 3
  field3: 1
  field4: 2
  [...]
  field25: 1
2:
  field1: 2
  field2: 1
  field3: 4
  field4: 0
  [...]
  field25: 2

我正在使用MySQL进行测试但与此无关。

给定一条记录,我需要检索与它最相似的记录;类似于字段的最低平均差异。我开始研究以下内容,但我不知道如何将其映射到在大型数据集中搜索相似性的问题。

2 个答案:

答案 0 :(得分:3)

我知道这是一个古老的帖子,但是对于那些寻求类似算法的人来说,一个效果特别好的是Cosine Similarity。找到一种方法来矢量化你的记录,然后寻找它们之间的最小角度的矢量。如果对记录进行矢量化并不简单,那么您可以通过一些已知算法对它们之间的相似性进行矢量化,然后查看相似矢量与完美匹配矢量的余弦相似性(假设完美匹配不是目标,因为它们很容易无论如何都找。我通过这种匹配得到了巨大的成果,甚至比较了在特定项目中工作的各个国家的人员名单以及对项目的各种贡献。矢量化意味着查看国家匹配的数量,国家不匹配,两个数据集之间匹配国家/地区的人口比例等等。我使用字符串编辑距离函数(如Levenshtein距离)从字符串差异中获取数值,但可以使用语音匹配只要目标数不为0(向量[0 0 ... 0]是任何向量的子空间,因此它的角度将是未定义的。有时可以远离问题,例如编辑的情况距离,我给出一个完美的匹配(编辑0)一个负重量,这样才能真正强调完美的匹配.1和1比1和2更远,这很有意义 - 完美匹配比任何偶数更好1拼写错误。

Cos(theta)=(A点B)/(Norm(A)* Norm(B))其中dot是点积,Norm是矢量的欧几里德幅度。

祝你好运!

答案 1 :(得分:0)

这是一种可能性,每个字段之间的平均距离(每个减去后的值来自需要匹配的给定记录):

SELECT id,
(
  ABS(field1-2)
  + ABS(field2-2)
  + ABS(field3-3)
  + ABS(field4-1)
  + ABS(field5-0)
  + ABS(field6-3)
  + ABS(field7-2)
  + ABS(field8-0)
  + ABS(field9-1)
  + ABS(field10-0)
  + ABS(field11-2)
  + ABS(field12-2)
  + ABS(field13-3)
  + ABS(field14-2)
  + ABS(field15-0)
  + ABS(field16-1)
  + ABS(field17-0)
  + ABS(field18-2)
  + ABS(field19-3)
  + ABS(field20-1)
  + ABS(field21-0)
  + ABS(field22-1)
  + ABS(field23-3)
  + ABS(field24-2)
  + ABS(field25-2)
)/25
AS distance 
FROM mytable
ORDER BY distance ASC
LIMIT 20;