Ich bin neu hier und so zu ELKI. Hier geht was ich zu tun versucht:Versuch, SLINK in eigenen Daten auszuführen - ELKI
Ich habe eine Liste von Instanzen
MyInstance
, die haben numerische und kategoriale Variablen wie{int xpto; String customer; int another, ...}
Ich brauche SLINK mit einem bestimmten Abstand Maßnahme gower für die laufen Fall für diese gesamte Liste der benutzerdefinierten Objekte
Nachdem die Tutorials zu lesen und die Posten ich folgende haben:
- habe ich eine Datenbankverbindung die Daten in DB laden
- ich meinen eigenen benutzerdefinierten Datentyp erstellt, die
FeatureVector
implementiert, obwohl jede der Instanzen nur ein Objekt hat - mein eigenes Objekt - ich die erstellt
SimpleTypeInformation(MyDataType.class)
Das Problem, das ich habe ist, dass wenn ich versuche, auf immer eine Beziehung
den Algorithmus es gibt mir eine null-Zeiger Ausnahme laufenException in thread "main" java.lang.NullPointerException bei de.lmu.ifi.dbs.elki.database.AbstractDatabase.getRelation (AbstractDatabase.java:118) bei de.lmu.ifi.dbs.elki. algorithm.AbstractAlgorithm.run (AbstractAlgorithm.java:81) bei main.TestingELKI.main (TestingELKI.java:104)
können Sie bitte hier helfen? Ich weiß nicht wirklich, was jetzt mit dem Erhalten der db Beziehungen
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);
Der MyDataType-> MyInstance sieht wie ein Hack aus. Kannst du nicht direkt mit MyInstance arbeiten? Auch deine Entfernungsfunktion ist nicht hier - vielleicht ist dein Fehler da? –
Vielen Dank für Ihre schnelle Antwort. Ich habe genau das getan, was Sie hier erwähnt haben: a) den Hack so geändert, dass nur MyInstance verwendet wird b) die neu angeordnete Distanzfunktion, um nur die MyInstance-Klasse zu verwenden ... scheint jetzt zu funktionieren, wenn die Methode getInputTypeRestriction die neue SimpleTypeInformation (MyInstance) zurückgibt .Klasse); Schätze wirklich deine Hilfe. Vielen Dank –