在ELKI中将DBSCAN与RStarTree一起使用时,出现UnsupportedOperationException异常

时间:2018-12-29 11:05:01

标签: java dbscan elki

我正在使用ELKI进行聚类,并且在许多数据集上尝试了1000次以上,这很好:D 但是,当我在其中一个文件(这是最大的文件)上运行它时,我看到初始化树时出错。 有什么问题?我该如何解决?

整个命令和结果在这里:

java -jar elki-bundle-0.7.1.jar KDDCLIApplication -verbose -verbose -enableDebug true -dbc.in my_input -parser.labelIndices 0 -db.index tree.spatial.rstarvariants.rstar.RStarTreeFactory -time -algorithm clustering.DBSCAN -algorithm.distancefunction geo.LngLatDistanceFunction -geo.model SphericalHaversineEarthModel -dbscan.epsilon 50.0 -dbscan.minpts 446 -resulthandler ResultWriter,ExportVisualizations -out my_output -vis.output my_visOutput 
  

de.lmu.ifi.dbs.elki.datasource.FileBasedDatabaseConnection.load:5716   女士   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.directory.capacity:   95   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.directory.minfill:   38   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.leaf.capacity:   153   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.leaf.minfill:   61节点不是目录节点!   java.lang.UnsupportedOperationException:节点不是目录节点!   在   de.lmu.ifi.dbs.elki.index.tree.AbstractNode.addDirectoryEntry(AbstractNode.java:240)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.insertDirectoryEntry(AbstractRStarTree.java:194)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.reInsert(AbstractRStarTree.java:655)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.overflow.LimitedReinsertOverflowTreatment.handleOverflow(LimitedReinsertOverflowTreatment.java:97)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.overflowTreatment(AbstractRStarTree.java:571)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.adjustTree(AbstractRStarTree.java:676)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.adjustTree(AbstractRStarTree.java:705)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.insertLeafEntry(AbstractRStarTree.java:175)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.reInsert(AbstractRStarTree.java:649)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.overflow.LimitedReinsertOverflowTreatment.handleOverflow(LimitedReinsertOverflowTreatment.java:97)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.overflowTreatment(AbstractRStarTree.java:571)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.adjustTree(AbstractRStarTree.java:676)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.insertLeafEntry(AbstractRStarTree.java:175)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.AbstractRStarTree.insertLeaf(AbstractRStarTree.java:151)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.insert(RStarTreeIndex.java:104)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.insertAll(RStarTreeIndex.java:129)   在   de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.rstar.RStarTreeIndex.initialize(RStarTreeIndex.java:94)   在   de.lmu.ifi.dbs.elki.database.StaticArrayDatabase.initialize(StaticArrayDatabase.java:168)   在   de.lmu.ifi.dbs.elki.workflow.InputStep.getDatabase(InputStep.java:63)   在de.lmu.ifi.dbs.elki.KDDTask.run(KDDTask.java:108)在   de.lmu.ifi.dbs.elki.application.KDDCLIApplication.run(KDDCLIApplication.java:61)   在   de.lmu.ifi.dbs.elki.application.AbstractApplication.runCLIApplication(AbstractApplication.java:194)   在   de.lmu.ifi.dbs.elki.application.KDDCLIApplication.main(KDDCLIApplication.java:96)   在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   在java.lang.reflect.Method.invoke(Method.java:498)在   de.lmu.ifi.dbs.elki.application.ELKILauncher.main(ELKILauncher.java:60)

1 个答案:

答案 0 :(得分:1)

不幸的是,没有数据,几乎无法再现。

显然,树中存在一些不一致之处,其中树不再正确地平衡。这将需要花费大量的精力进行调试,因此,如果您可以找到此 bug ,那么当然很好。快速查看堆栈轨迹,似乎是重新插入导致了第二次重新插入(IIRC,R *树允许同时进行多次重新插入,但只能在不同的级别;这实际上可能是不同的级别)。但是重新插入确实很难正确。实际上,我在某个地方可以更快更干净地实现ELKI的R树,但是我从来没有做过干净的重新插入。因此它们没有当前所有的功能(这就是为什么重写从未合并到ELKI中的原因)。

作为一种简单的解决方法(无论如何还是建议这样做),请改为使用-spatial.bulkstrategy SortTileRecursiveBulkSplit批量加载树。然后,将永远不会使用此代码路径(而且,无论如何,树都会更好,这会显着更快,因为“全局”批量加载会产生不重叠的叶子页面和低重叠的树)最佳填充)。

indexing documentation中推荐这样做,因为它具有更好的性能。