在搜索最合适的密度聚类工具并决定试用它的这几天,我一直在为ELKI喋喋不休。对于DBSCAN,我成功地重现了将文件“3clusters-and-noise-2d.csv”聚类的测试,并且还设法通过来自github的ELKI代码(最新版本)打印每个集群中的集群元数据和点在java中(我对cli或ui工具并不感兴趣)。
现在,我想使用某种内部java结构来创建数据库,而不是通过文件导入来减少写入和读取开销。
在提供的example中,我可以执行此操作但仅适用于文件的第一列。
我的问题基本上是,当java中已存在相同的数据时,如何创建通过文件创建的同一数据库?
知道了!
所以在经过一些调整之后,基本上你要做的就是使用2d数组的双精度数,其中每一行代表一个点,你的列数与你的维度一样......创建你的数据库而不读取文件,你基本上使用了一个ArrayAdapterDatabaseConnection如下:
double[][] data = new double[NUM_OF_POINTS][NUM_OF_DIMENSIONS];
//populate data according to your app
DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(data);
Database db = new StaticArrayDatabase(dbc, null);
db.initialize();
//dbscan algorithm setup
params = new ListParameterization();
params.addParameter(DBSCAN.Parameterizer.EPSILON_ID, 0.04);
params.addParameter(DBSCAN.Parameterizer.MINPTS_ID, 20);
DBSCAN<DoubleVector> dbscan = ClassGenericsUtil.parameterizeOrAbort(DBSCAN.class, params);
//run DBSCAN on database
Clustering<Model> result = dbscan.run(db);
我已经使用“3clusters-and-noise-2d.csv”数据集对此进行了测试,并且当我通过file或arrayadapter传递它们时,我可以确认得到相同的结果。
答案 0 :(得分:0)
可以在ELKI来源中找到完整的示例:
http://elki.dbs.ifi.lmu.de/browser/elki/elki/src/main/java/tutorial/javaapi/PassingDataToELKI.java
它生成随机数据并在其上运行k-means。它还显示了如何可靠地将DBIDs
映射回您的数据点。