2015-06-17 6 views
3

Я пытаюсь использовать ELKI из JAVA для запуска DBSCAN. Для тестирования я использовал FileBasedDatabaseConnection. Теперь я хотел бы запустить DBSCAN с моими пользовательскими объектами в качестве параметров.ELKI: Запуск DBSCAN на пользовательских объектах в Java

Мои объекты имеют следующую структуру:

public class MyObject { 
    private Long id; 
    private Float param1; 
    private Float param2; 
    // ... and more parameters as well as getters and setters 
} 

Я хотел бы запустить DBSCAN в ELKI с использованием List<MyObject> в качестве базы данных, но только некоторые из параметров должны быть приняты во внимание (например, при запущенном DBSCAN на объекты с использованием параметров param1, param2 и param4). В идеале результирующие кластеры содержат целые объекты.

Есть ли способ достичь такого поведения?

Если нет, то как я могу преобразовать объекты в формат, который ELKI понимает, и позволяет мне сопоставлять полученные кластер-объекты с моими пользовательскими объектами (т. Е. Есть простой способ программно установить метку)?

Этот вопрос возник из stackoverflow.com от этого дела Using ELKI on custom objects and making sense of results
Это может быть возможным решением проблемы. А как создан вектор-объект из моего List<MyObject>?

ответ

1

ELKI имеет модульную архитектуру.

Если вы хотите свой собственный источник данных, посмотрите на пакет datasource и реализуйте интерфейс DatabaseConnection (JavaDoc).

Если вы хотите обработать MyObject объектов (класс, которым вы поделились выше, вероятно, приносит существенное влияние на производительность), это не особенно сложно. Для идентификации вашего типа данных необходимо указать SimpleTypeInformation<MyObject> (JavaDoc), а реализовать PrimitiveDistanceFunction (JavaDoc) для ваш тип данных.

Если ваши фактические данные являются поплавками, я предлагаю вместо этого использовать DoubleVector или FloatVector. SubspaceEuclideanDistanceFunction для обработки только тех атрибутов, которые вы хотите использовать.

Для этих типов данных и многих функций расстояния можно использовать индексы R * -tree, существенно ускоряющие время выполнения DBSCAN.

A Cluster (JavaDoc) в ELKI never хранит данные о точках. Он хранит только точку DBIDs (Wiki). Вы можете получить данные точки из отношения базы данных или использовать, например, offsets (Wiki), чтобы отобразить их обратно в позицию списка для статических баз данных.

+0

Спасибо за подробный ответ. Теперь он работает. – RBo