如何使用Weka的DBSCAN对实例进行聚类?

时间:2011-09-17 07:10:55

标签: java cluster-analysis weka dbscan

我一直在尝试使用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;
}

这似乎不对。这应该怎么样?我应该使用不同的方法进行聚类吗?如果我想从中获取任何有用的信息,我是否必须按顺序在所有实例上按顺序运行此方法?

3 个答案:

答案 0 :(得分:5)

据报道这是一个错误 - [Wekalist] DBScan - Issue/Bug with "clusterInstance()"-Function

  

我正在使用DBScan库进行一些聚类。不幸的是   似乎函数“clusterInstance()”中存在错误。该   函数不返回已分配群集的编号但仅返回   返回第一个数据库元素的簇号(或者   第二次通话时为第二次,第三次通话时为第三次,依此类推。)   而不是指定的实例。

     

它根本无法工作,因为从未使用过指定的变量   功能。

回复如下:

  

DBScan和Optics是对Weka的贡献。如果你这可能是最好的   联系作者,看看他们是否可以建议修复错误。代码和   包裹信息(Weka 3.7)有联系信息:

     

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

我担心我不熟悉DBScan算法,现在代码已经很老了(2004),你可能很幸运,并且发现你仍然可以联系LMU慕尼黑的作者。

我确实通过Google Code SearchGitHub找到了大量的副本,但我找不到修复它的示例。在搜索时我注意到了DBScan的其他几个实现,你可以检查一下如何解决这个问题(例如ELKI's DBSCAN

正如我所说的,我不熟悉DBScan,但查看JavaDocs给我的印象是通过调用 buildClusterer(实例实例)来调用实际的聚类。检查源代码似乎在 buildClusterer 方法内部比 clusterInstance 方法更多。 OPTICS.java也包含一个clusterInstance方法,并且只会抛出一个异常。如果幸运的话,可能没有正常运行的 clusterInstance 方法。

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

答案 1 :(得分:0)

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

执行实际群集的方法是DBScan.buildClusterer(Instances instances)

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

答案 2 :(得分:0)

马克回答说,这显然是一个错误。只要您按照它们插入到群集器中的完全相同的顺序查询实例,就没关系;但它不适用于任何其他情况。

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

编辑此方法也是将throw new Exception更改为更合理的内容的好机会,例如return -1