Algorithm 在数据集中查找相似的记录

Algorithm 在数据集中查找相似的记录,algorithm,language-agnostic,matching,similarity,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进行测试,但并不依赖于它 给定一条记录,我需要检索与它最相似的记录;类似于字段的最低平均差。我开始研究以下内容,但我不知道如何将

我有一个包含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进行测试,但并不依赖于它

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


    • 这里有一种可能性,即每个字段之间的平均直线距离(每个减号后面的值来自需要匹配的给定记录):


      我知道这是一篇老文章,但对于任何寻求类似算法的人来说,余弦相似性尤其有效。找到一种将记录矢量化的方法,然后查找它们之间夹角最小的向量。如果对记录进行矢量化不是一件小事,那么您可以通过一些已知的算法对它们之间的相似性进行矢量化,然后查看相似性向量与完美匹配向量的余弦相似性(假设完美匹配不是目标,因为它们很容易找到)。通过这种匹配,我得到了巨大的结果,甚至可以将不同国家从事某一特定项目的人员名单与对该项目的各种贡献进行比较。矢量化意味着查看国家匹配的数量、国家不匹配、两个数据集之间匹配国家的人口比例等。我使用字符串编辑距离函数(如Levenshtein distance)从字符串差异中获取数值,但可以使用语音匹配,等等。只要目标数不是0(向量[0…0]是任何向量的子空间,因此其角度将是未定义的。有时为了避免这个问题,例如编辑距离的情况,我会给出一个完美匹配(e.d.0)负权重,因此非常强调完美匹配。-1和1比1和2远,这很有意义-完美匹配比拼写错误1的任何东西都好

      Cos(θ)=(A点B)/(范数(A)*范数(B)),其中点是点积,范数是向量的欧几里得幅值


      祝你好运!

      你的问题可以归类为最近邻搜索(见:)。关于这个问题有大量的文献。维基百科的文章可能提供有用的搜索途径。TY!你能推荐任何关于矢量化的资源吗?这是什么“直线平均距离”我不能用谷歌搜索。你是不是建议用这种方法来代替余弦相似性?
      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;