【问题标题】:ELKI DBSCAN Ignore ColumnsELKI DBSCAN 忽略列
【发布时间】:2017-10-03 20:39:40
【问题描述】:

我有一个包含多个列的 CSV 文件,其中的列是“lat、lon、item1”。我已经能够使用以下代码加载数据:

ListParameterization params = new ListParameterization();
List<ObjectFilter> filterlist = new ArrayList<>();
filterlist.add(new FixedDBIDsFilter(1));
NumberVectorLabelParser<DoubleVector> parser = new NumberVectorLabelParser<>(DoubleVector.FACTORY);         
FileBasedDatabaseConnection dbc = new FileBasedDatabaseConnection(filterlist, parser, is);    
params.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, dbc);
Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, params);
db.initialize();

我还运行了 DBSCAN 并检索了集群的数量,我可以从集群中提取数据。

ListParameterization params1 = new ListParameterization();
params1.addParameter(DBSCAN.Parameterizer.EPSILON_ID, 0.05);
params1.addParameter(DBSCAN.Parameterizer.MINPTS_ID, 2);
DBSCAN<DoubleVector> dbscan = ClassGenericsUtil.parameterizeOrAbort(DBSCAN.class, params1);
Clustering<Model> result = dbscan.run(db);

我可以看到 DBSCAN 使用所有三列进行扫描,因为当我只使用两列(纬度、经度)时,我会得到不同数量的簇。

我希望我的数据库中的所有列供以后访问,但只聚集在纬度/经度列之外。我相信我需要一些东西来标记其他列,以便它们不被使用,但我找不到正确的答案。我认为以下方法会起作用,但它没有:

params.addParameter(NumberVectorLabelParser.Parameterizer.LABEL_INDICES_ID, 2);

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: dbscan elki


    【解决方案1】:

    您需要通过NumberVectorLabelParser 位掩码参数将此参数传递给NumberVectorLabelParser(当前不是整数数组,而是位掩码,因此您需要new long[]{4L}) .

    您当前正在将参数传递给没有此参数的数据库。

    或者你可以使用DimensionSelectingLatLngDistanceFunction;因为无论如何你都不应该在纬度和经度上使用欧几里得距离。

    【讨论】:

    • 感谢您的帮助。花了一点时间来弄清楚位掩码是如何工作的,但我只使用了 lat 和 lon 列。我还更改了距离函数,Euclidean 和 DimensionSelectingLatLngDistanceFunction 的结果非常不同,但我会调整 epsilon 以使集群大小合适。
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 2018-06-11
    • 2014-07-01
    • 2014-07-15
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多