我一直在尝试使用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;
}
这似乎不对。这应该怎么样?我应该使用不同的方法进行聚类吗?如果我想从中获取任何有用的信息,我是否必须按顺序在所有实例上按顺序运行此方法?
答案 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 Search和GitHub找到了大量的副本,但我找不到修复它的示例。在搜索时我注意到了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
。