Попытка запустить SLINK в собственных данных - ELKI

Я новичок здесь и поэтому в ELKI. Вот что я пытаюсь сделать:

  1. У меня есть список экземпляров MyInstance с числовыми и категориальными переменными, такими как {int xpto; String customer; int another, ...}

  2. Мне нужно запустить SLINK с определенной мерой расстояния gower for case для всего этого списка пользовательских объектов.

Прочитав туториалы и посты, я сделал следующее:

  1. Я создал соединение с базой данных для загрузки данных в БД
  2. Я создал свой собственный пользовательский тип данных, который реализует FeatureVector, хотя каждый из экземпляров имеет только один объект — мой собственный пользовательский объект.
  3. Я создал SimpleTypeInformation(MyDataType.class)

У меня проблема в том, что когда я пытаюсь запустить алгоритм, он дает мне исключение нулевого указателя при получении отношения

Исключение в потоке «основной» java.lang.NullPointerException в de.lmu.ifi.dbs.elki.database.AbstractDatabase.getRelation(AbstractDatabase.java:118) в de.lmu.ifi.dbs.elki.algorithm.AbstractAlgorithm.run (AbstractAlgorithm.java:81) в main.TestingELKI.main(TestingELKI.java:104)

Не могли бы вы помочь здесь? Я не очень понимаю, что не так с получением отношений db

public class MyDatabaseConnection implements DatabaseConnection {

    private List<MyInstance> m_data;
    private int m_size;

    public MyDatabaseConnection(ArrayList<MyInstance> data, int size) {
        m_data = data;
        m_size = size;
    }

    @Override
    public MultipleObjectsBundle loadData() {
         MultipleObjectsBundle b = new MultipleObjectsBundle();
         int mind = 1;
         int maxd = 1;
         List<MyDataType> vecs = new ArrayList<>(m_size);
         for(int i = 0; i < m_size; i++) {
             vecs.add(new MyDataType(m_data.get(i)));
         }
         SimpleTypeInformation<MyDataType> type = new SimpleTypeInformation(MyDataType.class);
         b.appendColumn(type, vecs);
         return b;
    }
}

public class MyDataType implements FeatureVector {

    MyInstance m_instance;

    public static final MyDataType.Factory FACTORY = new MyDataType.Factory();

    public MyDataType(MyInstance instance) {
        m_instance = instance;
    }

    @Override
    public int getDimensionality() {
        // TODO Auto-generated method stub
        return 1;
    }

    @Override
    public Object getValue(int arg0) {
        // TODO Auto-generated method stub
        if (arg0 == 1) {
            return m_instance;
        } else {
            System.out.println("OOOOPPPPPPPSSSSS!");
            return null;
        }
    }


    public static class Factory implements FeatureVector.Factory {

        @Override
        public ByteBufferSerializer getDefaultSerializer() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Class getRestrictionClass() {
            // TODO Auto-generated method stub
            return MyDataType.class;
        }

        @Override
        public FeatureVector newFeatureVector(Object arg0, ArrayAdapter arg1) {
            // TODO Auto-generated method stub
            return new MyDataType(new MyInstance("0","0"));
        }
    }
}

MAIN
// create my database connection
        // load data into database  
        DatabaseConnection dbc = new MyDatabaseConnection(data, size);
        Database db = new StaticArrayDatabase(dbc, null);
        db.initialize();

        Relation<FeatureVector> labels = db.getRelation(TypeUtil.ANY);

        // now set the right distance function
        MyDistance dist = new MyDistance();
        SLINK algorithm = new SLINK(dist);

        Result res = algorithm.run(db);

person j_looking_answers    schedule 01.05.2016    source источник
comment
MyDataType->MyInstance выглядит как хак. Разве вы не можете работать с MyInstance напрямую? Кроме того, вашей функции расстояния здесь нет - может быть, ваша ошибка там?   -  person Has QUIT--Anony-Mousse    schedule 01.05.2016
comment
Большое спасибо за быстрый ответ. Я сделал именно то, что вы здесь упомянули: а) изменил хак, чтобы использовать только MyInstance b) перегруппировал функцию расстояния, чтобы использовать только класс MyInstance... кажется, теперь работает, как только я заявил в функции расстояния, что метод getInputTypeRestriction должен возвращать новый SimpleTypeInformation (MyInstance .сорт); Очень ценю вашу помощь. Большое спасибо   -  person j_looking_answers    schedule 03.05.2016


Ответы (1)


Вам не нужно наследовать от FeatureVector. Избегайте упаковки объектов - это дорого - просто используйте MyInstance напрямую.

Ошибка, которую вы видите, скорее всего, связана с тем, что вы неправильно реализовали функцию расстояния.

Скорее всего, ваша функция расстояния не указывает правильную информацию о типе ввода? Если вы укажете тип ввода null, вы получите NullPointerException вот так.

person Erich Schubert    schedule 02.05.2016
comment
Большое спасибо за быстрый ответ. Я сделал именно то, что вы здесь упомянули: а) изменил хак, чтобы использовать только MyInstance b) перегруппировал функцию расстояния, чтобы использовать только класс MyInstance... кажется, теперь работает, как только я заявил в функции расстояния, что метод getInputTypeRestriction должен возвращать новый SimpleTypeInformation (MyInstance .сорт); Очень ценю вашу помощь. Большое спасибо - person j_looking_answers; 03.05.2016
comment
@j_ooking_answers Если это сработало, вы должны принять его ответ. - person Has QUIT--Anony-Mousse; 10.05.2016