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

Oak*_*Oak 9 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ren 5

这被报告为一个错误 - [Wekalist] DBScan - 问题/错误与"clusterInstance()" - 功能.

我正在使用DBScan库进行一些聚类.不幸的是,似乎函数"clusterInstance()"中存在错误.该函数不返回已分配集群的编号,但仅返回第一个数据库元素的集群编号(或第二个调用中的第二个调用,第三个调用中的第三个,依此类推.)而不是返回已分配的实例.

它根本无法工作,因为从未在函数中使用赋值的变量.

回复如下:

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

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

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

我确实通过谷歌代码搜索GitHub找到了它的大量副本,但我找不到一个已修复的例子.在搜索时我确实注意到DBScan的其他几个实现,你可以检查一下如何解决这个问题(例如ELKI的DBSCAN)

正如我刚才所说,我不熟悉DBSCAN但看着JavaDoc中给我的印象是实际集群是通过调用调用buildClusterer(实例的实例).检查源代码似乎在buildClusterer方法中比clusterInstance方法更多.OPTICS.java也包含一个clusterInstance方法,并且只会抛出一个异常.如果你很幸运,也许你可以在没有运行的clusterInstance方法的情况下过关.

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


Oak*_*Oak 0

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

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

编辑此方法也是将 更改throw new Exception为在此上下文中更明智的内容的好机会,例如return -1.