Я новичок здесь и поэтому в ELKI. Вот что я пытаюсь сделать:
У меня есть список экземпляров
MyInstance
с числовыми и категориальными переменными, такими как{int xpto; String customer; int another, ...}
Мне нужно запустить SLINK с определенной мерой расстояния gower for case для всего этого списка пользовательских объектов.
Прочитав туториалы и посты, я сделал следующее:
- Я создал соединение с базой данных для загрузки данных в БД
- Я создал свой собственный пользовательский тип данных, который реализует
FeatureVector
, хотя каждый из экземпляров имеет только один объект — мой собственный пользовательский объект. - Я создал
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);