【问题标题】:Java clustering algorithm to handle both similarity and dissimilarity处理相似性和不相似性的Java聚类算法
【发布时间】:2017-03-24 19:48:46
【问题描述】:

我正在开发一个 Java 项目,我需要将用户查询与多个引擎进行匹配。 每个引擎都有一个方法 similarity(Object a, Object b),它返回:+1 如果对象肯定匹配; -1 如果对象肯定不匹配;存在不确定性时的任何浮动。

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

  • Engine 1 返回“Dragon Ball”、“Dragon Ball GT”、“Dragon Ball Z”,并声称它们是不同的结果(相似度=-1),无论它们的名字看起来多么相似。这个引擎是准确的,因此它具有很高的“权重”值。
  • 引擎 2 返回 100 个不同的结果。其中一些与 DBZ 有关,另一些与 DBGT 等有关。引擎声称它们都“非常相似”(相似度在 0.5 和 1 之间)。
  • 系统查询其他几个引擎 (10+)

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

是否有众所周知的聚类算法来解决这个问题?是否有可用的 Java 实现?我可以自己构建它,也许在支持库的帮助下?我擅长 Java(15 年以上经验),但我对集群完全陌生。

谢谢!

【问题讨论】:

  • 答案here没有帮助吗?
  • 我认为你的问题太宽泛了......但让我们谈谈其他人的想法。

标签: java cluster-analysis


【解决方案1】:

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

或者您可以使用1 + similarity 并取这些值的乘积,...或,或,或,...

但由于您显然更信任第一个分数,您可能还想增加它的影响力。对此没有数学解决方案,您可以根据自己的数据和偏好选择权重。如果您有训练数据,您可以为您的方法优化权重,您甚至可能希望丢弃一些无法正常工作或相关的排名。

【讨论】:

  • 我可以随意转换相似度函数,这不是问题。我的问题是:我应该将我的相似性/距离提供给什么算法/库,以便我可以从中获取集群? “集群”是指“相关节点的显式数组”。
  • 库推荐与 StackOverflow 无关。不过,您可以通过 Google 轻松找到一些内容。请注意,它们通常使用成对距离矩阵,其中每对对象只有 一个 条目。
猜你喜欢
  • 2012-06-11
  • 2012-04-27
  • 2012-04-08
  • 2020-07-12
  • 2012-09-30
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
相关资源
最近更新 更多