我有一个包含 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 进行测试,但并未与其绑定(bind)。
给定一条记录,我需要检索与其最相似的记录;类似于字段的最低平均差异。我开始查看以下内容,但我不知道如何将其映射到在大型数据集中搜索相似性的问题。
最佳答案
我知道这是一篇旧文章,但对于任何寻求类似算法的人来说,余弦相似度是特别有效的算法。找到一种方法来矢量化您的记录,然后寻找它们之间角度最小的矢量。如果对记录进行矢量化并不简单,那么您可以通过某种已知算法对它们之间的相似性进行矢量化,然后查看相似性向量与完美匹配向量的余弦相似度(假设完美匹配不是目标,因为它们很容易无论如何找到)。通过这种匹配,我得到了巨大的结果,甚至可以比较诸如不同国家从事特定项目的人员名单以及对该项目的各种贡献之类的信息。矢量化意味着查看国家/地区匹配的数量、国家/地区不匹配、两个数据集之间匹配国家/地区的人口比例等。我使用字符串编辑距离函数(如 Levenshtein 距离)从字符串差异中获取数值,但可以使用语音匹配等。只要目标数字不为0(向量[0 0 ... 0]是ANY向量的子空间,因此它的角度将是未定义的。有时为了逃避问题,例如编辑的情况距离,我给完美匹配(e.d. 0)一个负权重,这样真正强调了完美匹配。-1和1比1和2更远,这很有意义——完美匹配比任何带有偶数的匹配都要好1 个拼写错误。
Cos(theta) = (A dot B)/(Norm(A)*Norm(B)) 其中 dot 是点积,Norm 是向量的欧几里德量值。
祝你好运!
关于algorithm - 在数据集中查找相似记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054844/