У меня есть одномерный набор данных, для которого график гистограммы показывает несколько локальных максимумов, поэтому я знаю, что в моем одномерном пространстве, где данные более плотные, в моем одномерном пространстве есть несколько областей. Я хочу определить границы для этих плотных областей, которые позволяют мне классифицировать плотную область/кластер, в которой находится определенная точка данных. Для этого я использую OPTICS, потому что она должна иметь возможность лучше справляться с различной плотностью между кластерами по сравнению к DBSCAN.Получение границ кластеров ELKI OPTICSXi
Я использую ELKI (версия 0.6.0) в Java-коде (я знаю, что команда ELKI не вписывает ELKI в Java, но мне нужно повторить мой рабочий процесс для многих наборов данных и, следовательно, лучше автоматизировать это в моем случае). Фрагмент кода ниже выводит индексы начального и конечного элементов кластеров. В ELKI documentation on 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(). Как казалось, не было никакого способа получения этого приказал databased, я наивно пытался получить индексы от моего исходного входного набора данных, а не путем замены Println в коде выше ниже Println:
System.out.println(myListOfOneDimensionalFeatureVectors.get(cluster.getModel().getStartIndex())[0] + ", "+ myListOfOneDimensionalFeatureVectors.get(cluster.getModel().getEndIndex())[0] +"; ";
Как я Allready Однако ожидается , индексы, похоже, не принадлежат исходному входному файлу, так как это регулярно печатает конечные границы с более низкими значениями в моем одномерном пространстве, чем конечные границы. Знает ли anybode какой-либо способ получить исходные значения одномерных данных, соответствующие начальным и конечным индексам, найденным с кластеризацией OPTICS? Я хочу использовать эти значения позже в моем коде.
Спасибо, как за ответ, так и за отзыв о статистической части! Я действительно пытался использовать методы KDE, прежде чем пытаться ОПТИКА. Проблема заключалась в том, что после нахождения KDE, который хорошо подходит для данных, для получения кластеров от него все еще далеко не тривиально. Приятно слышать, что KNNKernelDensityMinimaClustering может предложить мне некоторые возможности в этом направлении. Вы случайно не знаете, есть ли информация о том, как KNNKernelDensityMinimaClustering вычисляет кластеры из плотности ядра? Javadoc из списка классов и публикаций на веб-сайте ELLI, похоже, не предоставляет информацию об этом. –
Не знаю. Обычно у них есть ссылка в JavaDoc, но этого класса нет. –
Я тоже переключился на версию ELKI. Еще один вопрос о фрагментах кода, которые вы предоставили. каков тип переменной «отношение» в вашем примере? Сначала я подумал, что это будет база данных, но it.seek возвращает объект типа DBIDArrayIter, и при потере базы данных в результате получается ошибка get (DBIDArrayIter) для базы данных типа. –