我有一个一维数据集,其直方图显示多个局部最大值,所以我知道我的一维空间中有多个区域数据更密集。我想确定这些密集区域的边界,以便我对某个数据点所在的密集区域/集群进行分类。为此,我使用 OPTICS,因为它应该能够更好地处理比较集群之间的不同密度到 DBSCAN。
我在 Java 代码中使用 ELKI(版本 0.6.0)(我知道 ELKI 团队不建议将 ELKI 嵌入 Java 中,但我需要为许多数据集重复我的工作流程,因此在我的情况下最好自动执行此操作) . 下面的代码片段打印集群的开始和结束项的索引。OPTICSModel 上的ELKI 文档没有明确定义这些索引号对应的内容,但我假设这些是数据库的增强集群排序中开始和结束数据项的索引(例如 OPTICS.run() 的 ClusterOrderResult 对象-created),而不是数据库本身的开始和结束数据项的索引(无序)。
ListParameterization opticsParams = new ListParameterization();
opticsParams.addParameter(OPTICSXi.XI_ID, 0.01);
opticsParams.addParameter(OPTICS.MINPTS_ID, 100);
OPTICSXi<DoubleDistance> optics = ClassGenericsUtil.parameterizeOrAbort(OPTICSXi.class, opticsParams);
ArrayAdapterDatabaseConnection arrayAdapterDatabaseConnection = new ArrayAdapterDatabaseConnection(myListOfOneDimensionalFeatureVectors.toArray(new double[myListOfOneDimensionalFeatureVectors.size()][2]));
ListParameterization dbParams = new ListParameterization();
dbParams.addParameter(AbstractDatabase.Parameterizer.INDEX_ID, RStarTreeFactory.class);
dbParams.addParameter(RStarTreeFactory.Parameterizer.BULK_SPLIT_ID, SortTileRecursiveBulkSplit.class);
dbParams.addParameter(AbstractDatabase.Parameterizer.DATABASE_CONNECTION_ID, arrayAdapterDatabaseConnection);
Database db = ClassGenericsUtil.parameterizeOrAbort(StaticArrayDatabase.class, dbParams);
db.initialize();
result = optics.run(db);
List<Cluster<OPTICSModel>> clusters = result.getAllClusters();
for(Cluster<OPTICSModel> cluster : clusters){
if(!cluster.isNoise())
System.out.println(cluster.getModel().getStartIndex() + ", "+ cluster.getModel().getEndIndex() +"; ");
}
现在我想知道我的集群在我的一维空间中的哪里开始和结束。因此,我想检索与我上面的代码已经获得的开始和结束索引相对应的数据项。我假设我需要一个 ClusterOrderResult 对象,然后我可以从中检索获得的索引。然而,在文档中,似乎无法从我通过调用 optics.run() 获得的聚类结果对象中检索到这样的东西。由于似乎没有办法获得这个有序的数据库,我天真地尝试从我的原始输入数据集中获取索引,而不是用下面的 println 替换上面代码中的 println:
System.out.println(myListOfOneDimensionalFeatureVectors.get(cluster.getModel().getStartIndex())[0] + ", "+ myListOfOneDimensionalFeatureVectors.get(cluster.getModel().getEndIndex())[0] +"; ";
然而,正如我已经预料到的那样,索引似乎不属于原始输入文件,因为这会定期在我的一维空间中打印末端边界,其值低于末端边界。是否有人知道任何方法来获取与 OPTICS 聚类发现的开始和结束索引相对应的原始一维数据值?我想稍后在我的代码中使用这些值。