【问题标题】:How to cluster an instance with Weka's DBSCAN?如何使用 Weka 的 DBSCAN 对实例进行集群?
【发布时间】:2011-11-19 04:02:56
【问题描述】:

我一直在尝试使用 Weka 的 DBSCAN 集群器来集群实例。据我了解,我应该为此使用clusterInstance() 方法,但令我惊讶的是,在查看该方法的代码时,看起来实现忽略了参数:

/**
 * Classifies a given instance.
 *
 * @param instance The instance to be assigned to a cluster
 * @return int The number of the assigned cluster as an integer
 * @throws java.lang.Exception If instance could not be clustered
 * successfully
 */
public int clusterInstance(Instance instance) throws Exception {
    if (processed_InstanceID >= database.size()) processed_InstanceID = 0;
    int cnum = (database.getDataObject(Integer.toString(processed_InstanceID++))).getClusterLabel();
    if (cnum == DataObject.NOISE)
        throw new Exception();
    else
        return cnum;
}

这似乎不对。那应该如何工作?我应该使用其他方法进行聚类吗?如果我想从中获取任何有用的信息,是否必须在所有实例上按特定顺序依次运行此方法?

【问题讨论】:

  • 附注。 DBSCAN 全部大写,而不是 DBScan。只是 Weka 中的另一个错误。不幸的是,Weka 中的集群并不是很有用。毕竟,Weka 更像是一个机器学习工具包。
  • 请不要再使用 Wekas 版本的 DBSCAN 和 OPTICS。它们是不受支持的学生贡献,功能不完整且非常缓慢。对于集群,请改用 ELKI。
  • 更新:Weka DBSCAN 1.0.3 版变得明显更快(虽然不如 ELKI 快)。 OPTICS 也是如此,但它不会自动从图中提取集群(参见 ELKI OPTICSXi)。

标签: java cluster-analysis weka dbscan


【解决方案1】:

这已被报告为错误 - [Wekalist] DBScan - Issue/Bug with "clusterInstance()"-Function

我正在使用 DBScan 库进行一些聚类。不幸的是 似乎函数“clusterInstance()”中有一个错误。这 函数不返回分配的簇的编号,而只返回 返回第一个数据库元素的簇号(或 第二次调用第二次,第三次调用第三次,依此类推。) 而不是分配的实例。

它根本无法工作,因为分配的变量从未在 函数。

回复如下:

DBScan 和 Optics 是对 Weka 的贡献。如果你可能是最好的 联系作者,看看他们是否可以提出错误修复建议。代码和 package info (Weka 3.7) 有联系方式:

http://weka.sourceforge.net/packageMetaData/optics_dbScan/index.html

恐怕我对 DBScan 算法不熟悉,而且代码现在已经很老了(2004 年),你可能很幸运,发现你仍然可以联系到慕尼黑大学的作者。

我确实通过Google Code SearchGitHub 找到了它的许多副本,但我找不到已修复它的示例。在搜索时,我确实注意到了 DBScan 的其他几个实现,您可以检查它们以找出如何修复这个实现(例如 ELKI's DBSCAN

正如我所说,我不熟悉 DBScan,但查看 JavaDocs 给我的印象是,实际集群是通过调用 buildClusterer(Instances instances) 调用的。查看源代码,buildClusterer 方法内部似乎比clusterInstance 方法要多得多。 OPTICS.java 也包含一个 clusterInstance 方法,该方法只是抛出一个异常。如果你很幸运,也许你可以在没有正常运行的 clusterInstance 方法的情况下度过难关。

我在这里找到了一个使用 Weka 的 DBScan 的示例:DBSCANClustering.java

【讨论】:

  • 感谢您确认这是一个错误并将我指向相关示例。一旦我找到一种真正解决它的方法,我会在这里发布它作为答案。
  • DBSCAN 和 OPTICS 在 Weka 中几乎不受支持。遗憾的是,总的来说,Weka 的集群能力并不值得研究。
  • 它们也非常慢。绝对不要在这里使用 Weka。
  • 请不要再使用 Weka 的 DBSCAN 和 OPTICS! 它们是陈旧且不受支持的学生贡献,它们的表现真的很糟糕。使用 ELKI 进行聚类。
  • 更新:Weka DBSCAN 1.0.3 版变得明显更快(虽然不如 ELKI 快)。 OPTICS 也是如此,但它不会自动从图中提取集群(参见 ELKI OPTICSXi)。
【解决方案2】:

Mark 发布的示例很好地展示了如何使用 DBScan 类。

进行实际聚类的方法是DBScan.buildClusterer(Instances instances)

DBScan.clusterInstance(Instance instance) 应该返回给定实例的分配集群的编号(在您运行 buildClusterer 方法之后)。但是这个参数确实被忽略了,所以我猜它不会做它应该做的事情。

【讨论】:

  • buildClusterer 在任何情况下都应该被调用,对于其他集群类型也是如此。
  • @Oak 是的,我只是想指出buildClusterer 似乎在这里进行了实际的聚类。
【解决方案3】:

正如马克回答的那样,这显然是一个错误。只要您以与插入集群的顺序完全相同的顺序查询实例,就可以了;但在其他任何情况下都不起作用。

一位同事通过编写自己的 DBScan 类版本解决了这个问题:基本相同(复制粘贴),只是她维护了实例和集群标签之间的映射。可以通过迭代 database 实例的内容来生成此映射。然后可以立即从该映射中检索实例的适当集群。

编辑此方法也是将throw new Exception 更改为在此上下文中更合理的名称的好机会,例如return -1

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 2015-06-04
    • 2015-02-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 1970-01-01
    相关资源
    最近更新 更多