9

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

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

4

3 回答 3

5

这已被报告为错误 - [Wekalist] DBScan - 带有“clusterInstance()”-Function 的问题/错误

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

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

回复内容如下:

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

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

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

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

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

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

于 2011-09-21T22:22:41.293 回答
0

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

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

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

于 2011-09-22T00:00:45.293 回答
0

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

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

编辑此方法也是一个很好的机会,可以throw new Exception在这种情况下将return -1.

于 2011-11-16T18:39:33.570 回答