2016-11-10 53 views
0

我正在开发一个Java项目,我需要将用户查询与几个引擎进行匹配。每个引擎都有一个方法相似性(对象a,对象b)返回:+1如果对象确实匹配; -1如果对象肯定不匹配;当存在不确定性时,任何中间浮动。用于处理相似性和差异性的Java聚类算法

示例:用户搜索“龙珠”。

  • 发动机1返回“龙珠”,“龙珠GT”,“龙珠Z”,并声称它们是不同的结果(相似度= -1),无论他们的名字看起来多么相似。该发动机准确,因此具有很高的“重量”值。
  • 发动机2返回100个不同的结果。其中一些涉及DBZ,另一些涉及DBGT等。引擎声称它们都“非常相似”(0.5和1之间的相似性)。
  • 该系统查询其他几个引擎(10+)

我正在寻找一种方式来构建集群出这个系统。我需要确保具有接近-1的相似性的值可能最终会出现在不同的群集中,即使其他许多值与其中的所有值非常相似。

有没有一个众所周知的聚类算法来解决这个问题?有没有可用的Java实现?我可以在支持库的帮助下自行构建它吗?我擅长Java(15年以上的经验),但我在集群方面是全新的。

谢谢!

+0

答案[这里](http://stackoverflow.com/questions/2129269/java-clustering-library)没有帮助吗? – Ironcache

+0

我认为你的问题太广泛了...但让我们说别人的想法。 – GhostCat

回答

0

明显的方法是使用“1-相似度”作为距离函数,从而将从0变为2.然后将它们相加。

或者你可以使用1 + similarity并采取这些值的产品,...或者,或者,或者,...

但因为你显然相信第一次得分多,你可能还需要增加其影响。对此没有数学解决方案,你可以根据你的数据和偏好来选择权重。如果你有训练数据,你可以为你的方法优化权重,如果他们不能很好地工作或关联,你甚至可能会丢弃一些跑步者。

+0

但是我可以转换我的相似度函数,但这不是问题。我的问题是:我应该使用什么算法/库来提供我的相似度/距离,以便我可以从中获取集群?对于“群集”,我的意思是“相关节点的显式数组”。 – agdev84

+0

对于StackOverflow而言,库的建议是无关紧要的。不过,您可以轻松找到一些Google。请注意,他们通常以成对距离矩阵为单位,每对对象只有* 1 *条目。 –