У меня есть одномерный набор данных, для которого график гистограммы показывает несколько локальных максимумов, поэтому я знаю, что в моем одномерном пространстве есть несколько областей, где данные более плотные. Я хочу определить границы для этих плотных регионов, которые позволяют мне классифицировать плотный регион/кластер, в котором находится определенная точка данных. Для этого я использую ОПТИК, потому что он должен иметь возможность лучше справляться с различной плотностью между сравниваемыми кластерами. к DBSCAN.
Я использую ELKI (версия 0.6.0) в коде Java (я знаю, что команда ELKI не рекомендует встраивать ELKI в Java, но мне нужно повторить рабочий процесс для многих наборов данных, и поэтому лучше автоматизировать это в моем случае) . Фрагмент кода ниже выводит индексы начального и конечного элементов кластеров. Документация ELKI по OPTICSModel четко не определяет, чему соответствуют эти номера индексов, но я предполагаю, что это индексы начального и конечного элементов данных в расширенном кластерном упорядочении базы данных (например, объект ClusterOrderResult, который OPTICS.run()-созданный), в отличие от индексов начального и конечного элементов данных самой базы данных (неупорядоченных).
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? Я хочу использовать эти значения позже в своем коде.