在这里寻找一些建议。有没有人知道在n维空间中开始研究匹配算法的好地方。例如,任何约会网站必须使用某种算法来匹配2个人。我所读到的是,我们可以使用针对每个特征的点系统来映射n维阵列中的人的特征。一旦我们拥有了一个人的所有(可用)特征,我们就可以在n维数组中的某个点上表示这个人。然后,匹配2个人就像在这个n-dim阵列中找到2点之间的最短距离一样简单。有没有人对这类算法的实现有任何参考?写这些东西最好的语言是什么?
答案 0 :(得分:6)
如果你想找到一个人最接近的匹配,Bentley& Shamos发表了一种多维分治法:O(N log N)时间中的分治:Divide-and-conquer in multidimensional space在第八届年度ACM计算理论研讨会论文集1976中。如果你能'获取副本this也可能有所帮助。
然而,对于您的示例应用程序,实际上找到最近邻居似乎不是最大的问题 - 将输入映射到维度上要困难得多。例如,如果一个维度是“喜欢动物”,那么你对喜欢狗和动物的人有什么价值?猫但不能忍受马?那些爱马的人,认为狗是好的,对猫很生气,对金鱼很矛盾吗?
答案 1 :(得分:1)
首先,选择您最熟悉的语言。处理这个的算法相当简单,并且应该适用于任何现代语言。 (只要有一些数组的概念,并且可能是矩阵库,你应该没问题。)我之前在C,C ++和C#中实现了很多这些,但是在python,vb.net等中看到了实现
根据您的目的,有几种选择。
话虽这么说,你想做的事情取决于你的目标。如果您只想找到最佳匹配,可以使用简单距离计算(即:n维数组中每个维度/属性的平方和的sqrt),可选地对每个属性距离进行加权,并使用最近的点。 / p>
如果你想将人们聚在一起,你会想看看clustering algorithms。对于这样的数据,我怀疑某种形式的K-Means聚类或模糊c均值聚类将是最好的。
答案 2 :(得分:1)
您提到的过程称为k最近邻,k = 1。这是找到类似向量的最直观的方法。
答案 3 :(得分:1)
如何解决以下问题。
假设用户是U1,U2,U3,U4,U5 .... Un。 属性是A1,A2,A3,A4,A5 ..... Am
将这些存储为
A1 - U1,U2,U3 ...... A2 - U4,U6,U7 ...... A3 -
Profile属性是索引并存储所有用户。现在,如果有新用户,请查看其属性以及这些属性,找到普通人。一个人在这些列表中存在的次数 - 更高的排名。
答案 4 :(得分:0)
您在示例中描述的不是n维定义匹配,而是具有多个特征的bipartite matching个节点。 (你需要提供一个函数,给定两个人计算这个距离)。应该有非常有效的算法。在n维定位匹配中,您将尝试匹配来自两组以上的节点(在您的示例中,假设您可以将人们切换为身体,灵魂和音乐偏好,然后将它们重新组合以创建新人。然后,n维定义匹配将将人们分开,并重新组合他们,以便新设计的人能成为非常好的夫妻:D)这是wikipedia article for 3-dimentional matching,这是np-complete。
此外,正如另一个人所指出的,如果您的目标不是成对匹配,而是找到兼容的群组,则应考虑将它们群集到群组中。这可以用例如Unsupervised Learning