ELKI DBSCAN忽略列

时间:2017-10-03 20:39:41

标签: dbscan elki

我有一个包含多列的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使用所有三列进行扫描,因为当我只使用两列时,lat,lon,我得到不同数量的簇。

我想在我的数据库中包含所有列以供以后访问,但只关闭lat / lon列的群集。我相信我需要一些东西来标记其他列,以便它们不被使用,但我找不到正确的答案。我认为以下内容可行,但事实并非如此:

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

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您需要通过其NumberVectorLabelParser位掩码参数将此参数传递给long[] labelIndices(这当前不是整数数组,但是有点掩码,所以你想要new long[]{4L})。

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

或者您可以使用DimensionSelectingLatLngDistanceFunction;因为你不应该在纬度和经度上使用欧几里德距离。