如何使用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; } 

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

这被报告为一个错误 – [Wekalist] DBScan – 问题/错误与“clusterInstance()” – function 。

我正在使用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,但查看JavaDocs给我的印象是通过调用buildClusterer(实例实例)来调用实际的聚类。 检查源代码似乎在buildClusterer方法中比clusterInstance方法更多。 OPTICS.java也包含一个clusterInstance方法,并且只会抛出一个exception。 如果你很幸运,也许你可以在没有运行的clusterInstance方法的情况下过关

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

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

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

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

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

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

编辑此方法也是一个很好的机会,可以throw new Exception更改为在此上下文中更合理的内容,例如return -1