2

У меня есть одномерный набор данных, для которого график гистограммы показывает несколько локальных максимумов, поэтому я знаю, что в моем одномерном пространстве, где данные более плотные, в моем одномерном пространстве есть несколько областей. Я хочу определить границы для этих плотных областей, которые позволяют мне классифицировать плотную область/кластер, в которой находится определенная точка данных. Для этого я использую 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? Я хочу использовать эти значения позже в моем коде.

ответ

2

Для автоматизации это работает очень хорошо, чтобы вызвать ELKI из командной строки. Это мой предпочтительный способ, потому что таким образом каждый прогон красиво изолирован в своей собственной JVM.

Тогда у вас будет легкий доступ к этим данным из выходных файлов.

Почему вы используете старый вариант ELKI? Версии 0.6.5 намного лучше из-за удаленных дженериков. Хотя сейчас я перешел на версию github.

Если вы хотите получить прямой доступ к объекту ClusterOrder, он прикрепляется к кластерному объекту как результат ребенка. Вы должны быть в состоянии получить его с помощью

ClusterOrder clusterOrder = ResultUtil.filterResults(clustering, ClusterOrder.class).get(0); 

и его объектные идентификаторы с помощью:

ArrayDBIDs ids = DBIDUtil.ensureArray(clusterOrder.getDBIDs()); 

(ensureArray над головой, но это Noop то в любом случае - это операция литой или конвертирование с, и здесь он будет отлит, по крайней мере, в моей версии ELKI идентификаторы всегда сохраняются как ArrayDBID)

Итераторы массива (DBIDArrayIter it = ids.iter()) могут быть перемещены в положение через seek(offset).Таким образом, вы должны быть в состоянии использовать что-то вроде

DBIDArrayIter it = ids.iter(); 
NumberVector vec = relation.get(it.seek(model.getStartIndex())); 

Итераторы в ELKI являются нечетными для Java APIs, но очень быстро, если вы используете одного итератора для всех доступов.

Так много для вопроса ELKI. Однако из статистических данных точка зрения не имеет смысла использовать ОПТИКИ на одномерных данных. На одномерных данных используйте правильную оценку плотности ядра . ОПТИКА - грубый и грубый метод, который имеет смысл, когда ваши данные слишком сложны для моделирования с использованием правильных статистических инструментов. ОПТИКА использует очень примитивную плотность ядра, а метод xi - очень наивное извлечение кластеров из графика плотности ... по крайней мере на одномерных данных, статистика предлагает более сильные инструменты. ELKI имеет реализацию под названием KNNKernelDensityMinimaClustering, но я еще не использовал ее. Но оценка плотности ядра должна быть доступна в любом статистическом инструментарии, поэтому я бы попробовал этот класс.

+0

Спасибо, как за ответ, так и за отзыв о статистической части! Я действительно пытался использовать методы KDE, прежде чем пытаться ОПТИКА. Проблема заключалась в том, что после нахождения KDE, который хорошо подходит для данных, для получения кластеров от него все еще далеко не тривиально. Приятно слышать, что KNNKernelDensityMinimaClustering может предложить мне некоторые возможности в этом направлении. Вы случайно не знаете, есть ли информация о том, как KNNKernelDensityMinimaClustering вычисляет кластеры из плотности ядра? Javadoc из списка классов и публикаций на веб-сайте ELLI, похоже, не предоставляет информацию об этом. –

+0

Не знаю. Обычно у них есть ссылка в JavaDoc, но этого класса нет. –

+0

Я тоже переключился на версию ELKI. Еще один вопрос о фрагментах кода, которые вы предоставили. каков тип переменной «отношение» в вашем примере? Сначала я подумал, что это будет база данных, но it.seek возвращает объект типа DBIDArrayIter, и при потере базы данных в результате получается ошибка get (DBIDArrayIter) для базы данных типа. –

Смежные вопросы