正在尝试 运行 SLINK 自己的数据 - ELKI

Attempting to run SLINK in own data - ELKI

我是新来的,对 ELKI 也是如此。这是我正在尝试做的事情:

  1. 我有一个实例列表 MyInstance,其中包含数值和分类变量,例如 {int xpto; String customer; int another, ...}

  2. 我需要 运行 SLINK 与特定的距离度量 gower 对于这个案例 对于整个自定义对象列表

阅读教程和帖子后,我执行了以下操作:

  1. 我创建了一个数据库连接来将数据加载到数据库中
  2. 我创建了自己的自定义数据类型,它实现了 FeatureVector 尽管每个实例只有一个对象——我自己的自定义对象
  3. 我创建了 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