如何使用 ELKI 的 DBSCAN 获取集群包含的原始点?
How to get the original points the cluster contained using ELKI's DBSCAN?
我对以下代码有 2 个问题:
如何得到结果中每个簇中的'points'?
结果怎么可能包含 3 个簇,其中一个簇的大小为 0?
import de.lmu.ifi.dbs.elki.data.model.Model;
import de.lmu.ifi.dbs.elki.database.StaticArrayDatabase;
import de.lmu.ifi.dbs.elki.datasource.ArrayAdapterDatabaseConnection;
import de.lmu.ifi.dbs.elki.datasource.DatabaseConnection;
import de.lmu.ifi.dbs.elki.distance.distancefunction.geo.LatLngDistanceFunction;
import de.lmu.ifi.dbs.elki.math.geodesy.WGS84SpheroidEarthModel;
import java.util.List;
import de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN;
import de.lmu.ifi.dbs.elki.data.Cluster;
import de.lmu.ifi.dbs.elki.data.Clustering;
import de.lmu.ifi.dbs.elki.data.DoubleVector;
/**
*
* @author Paul Z. Wu Jan 14, 2018
*/
public class DBScan {
public static void main(String args[]) {
final double[][] data = new double[][]{{48.774332, -78.532054}, {40.774032, -73.531154},
{40.774232, -73.531084}, {48.774332, -78.531054}};
DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(data);
DBSCAN<DoubleVector> scan = new DBSCAN<>(new LatLngDistanceFunction(WGS84SpheroidEarthModel.STATIC), 2000, 1);
StaticArrayDatabase db = new StaticArrayDatabase(dbc, null);
db.initialize();
Clustering<Model> c = scan.run(db);
System.out.println(c.getAllClusters().isEmpty());
List<Cluster<Model>> list = c.getAllClusters();
for (Cluster<Model> cl : list) {
System.out.println("size=" + cl.size());
System.out.println("...." + cl.getIDs() + "..." + cl.getModel() + " ");
//How to get the original 'points' in this cluster? One of them should
//contain {40.774032, -73.531154},{40.774232, -73.531084}
}
}
见tutorial.javaapi.PassingDataToELKI line 73
Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
见tutorial.javaapi.PassingDataToELKI lines 102-104
for(DBIDIter it = clu.getIDs().iter(); it.valid(); it.advance()) {
// To get the vector use:
NumberVector v = rel.get(it);
}
ELKI 使用“整洁数据”架构。大多数算法都需要向量的数据库关系(想想:列,或 table)。实际上,与列存储并无不同,但在压缩连续密集数据方面没有任何好处。通常具有固定的维度(=矢量场)。对于地理数据,您甚至可以将其指定为正好具有 2 个维度。
标签将在一秒钟内存储 relation/table/column。
另请参阅 GeoIndexing 示例以将 DBSCAN 扩展到更大的数据集。我已经在 2300 万个地理坐标上使用了 OPTICS,但显然 运行 需要一段时间(虽然不是几天)。我建议为大型数据集启用进度记录,它甚至会尝试估计剩余时间。
我对以下代码有 2 个问题:
如何得到结果中每个簇中的'points'?
结果怎么可能包含 3 个簇,其中一个簇的大小为 0?
import de.lmu.ifi.dbs.elki.data.model.Model; import de.lmu.ifi.dbs.elki.database.StaticArrayDatabase; import de.lmu.ifi.dbs.elki.datasource.ArrayAdapterDatabaseConnection; import de.lmu.ifi.dbs.elki.datasource.DatabaseConnection; import de.lmu.ifi.dbs.elki.distance.distancefunction.geo.LatLngDistanceFunction; import de.lmu.ifi.dbs.elki.math.geodesy.WGS84SpheroidEarthModel; import java.util.List; import de.lmu.ifi.dbs.elki.algorithm.clustering.DBSCAN; import de.lmu.ifi.dbs.elki.data.Cluster; import de.lmu.ifi.dbs.elki.data.Clustering; import de.lmu.ifi.dbs.elki.data.DoubleVector; /** * * @author Paul Z. Wu Jan 14, 2018 */ public class DBScan { public static void main(String args[]) { final double[][] data = new double[][]{{48.774332, -78.532054}, {40.774032, -73.531154}, {40.774232, -73.531084}, {48.774332, -78.531054}}; DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(data); DBSCAN<DoubleVector> scan = new DBSCAN<>(new LatLngDistanceFunction(WGS84SpheroidEarthModel.STATIC), 2000, 1); StaticArrayDatabase db = new StaticArrayDatabase(dbc, null); db.initialize(); Clustering<Model> c = scan.run(db); System.out.println(c.getAllClusters().isEmpty()); List<Cluster<Model>> list = c.getAllClusters(); for (Cluster<Model> cl : list) { System.out.println("size=" + cl.size()); System.out.println("...." + cl.getIDs() + "..." + cl.getModel() + " "); //How to get the original 'points' in this cluster? One of them should //contain {40.774032, -73.531154},{40.774232, -73.531084} } }
见tutorial.javaapi.PassingDataToELKI line 73
Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
见tutorial.javaapi.PassingDataToELKI lines 102-104
for(DBIDIter it = clu.getIDs().iter(); it.valid(); it.advance()) {
// To get the vector use:
NumberVector v = rel.get(it);
}
ELKI 使用“整洁数据”架构。大多数算法都需要向量的数据库关系(想想:列,或 table)。实际上,与列存储并无不同,但在压缩连续密集数据方面没有任何好处。通常具有固定的维度(=矢量场)。对于地理数据,您甚至可以将其指定为正好具有 2 个维度。
标签将在一秒钟内存储 relation/table/column。
另请参阅 GeoIndexing 示例以将 DBSCAN 扩展到更大的数据集。我已经在 2300 万个地理坐标上使用了 OPTICS,但显然 运行 需要一段时间(虽然不是几天)。我建议为大型数据集启用进度记录,它甚至会尝试估计剩余时间。