正在尝试 运行 SLINK 自己的数据 - ELKI
Attempting to run SLINK in own data - ELKI
我是新来的,对 ELKI 也是如此。这是我正在尝试做的事情:
我有一个实例列表 MyInstance
,其中包含数值和分类变量,例如 {int xpto; String customer; int another, ...}
我需要 运行 SLINK 与特定的距离度量 gower 对于这个案例 对于整个自定义对象列表
阅读教程和帖子后,我执行了以下操作:
- 我创建了一个数据库连接来将数据加载到数据库中
- 我创建了自己的自定义数据类型,它实现了
FeatureVector
尽管每个实例只有一个对象——我自己的自定义对象
- 我创建了
SimpleTypeInformation(MyDataType.class)
我遇到的问题是,当我尝试 运行 算法时,它在获取关系时给了我一个空指针异常
Exception in thread "main" java.lang.NullPointerException at
de.lmu.ifi.dbs.elki.database.AbstractDatabase.getRelation(AbstractDatabase.java:118)
at
de.lmu.ifi.dbs.elki.algorithm.AbstractAlgorithm.run(AbstractAlgorithm.java:81)
at main.TestingELKI.main(TestingELKI.java:104)
你能帮忙吗?我现在真的不知道获取数据库关系有什么问题
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);
您不需要继承自 FeatureVector
。避免装箱对象 - 这很昂贵 - 直接使用 MyInstance
。
您看到的错误很可能是因为您没有正确实现距离函数。
很有可能,您的距离函数没有指定其正确的输入类型信息?如果你提供输入类型null
,那么你会得到一个像这样的NullPointerException
。
我是新来的,对 ELKI 也是如此。这是我正在尝试做的事情:
我有一个实例列表
MyInstance
,其中包含数值和分类变量,例如{int xpto; String customer; int another, ...}
我需要 运行 SLINK 与特定的距离度量 gower 对于这个案例 对于整个自定义对象列表
阅读教程和帖子后,我执行了以下操作:
- 我创建了一个数据库连接来将数据加载到数据库中
- 我创建了自己的自定义数据类型,它实现了
FeatureVector
尽管每个实例只有一个对象——我自己的自定义对象 - 我创建了
SimpleTypeInformation(MyDataType.class)
我遇到的问题是,当我尝试 运行 算法时,它在获取关系时给了我一个空指针异常
Exception in thread "main" java.lang.NullPointerException at de.lmu.ifi.dbs.elki.database.AbstractDatabase.getRelation(AbstractDatabase.java:118) at de.lmu.ifi.dbs.elki.algorithm.AbstractAlgorithm.run(AbstractAlgorithm.java:81) at main.TestingELKI.main(TestingELKI.java:104)
你能帮忙吗?我现在真的不知道获取数据库关系有什么问题
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);
您不需要继承自 FeatureVector
。避免装箱对象 - 这很昂贵 - 直接使用 MyInstance
。
您看到的错误很可能是因为您没有正确实现距离函数。
很有可能,您的距离函数没有指定其正确的输入类型信息?如果你提供输入类型null
,那么你会得到一个像这样的NullPointerException
。