Получение Евклидова расстояния от Java API Weka - PullRequest
0 голосов
/ 15 июля 2011

Я использую Java API библиотеки машинного обучения Weka ...

Я пытаюсь вычислить расстояние между двумя экземплярами, используя класс EuclidianDistance:

http://weka.sourceforge.net/doc.dev/weka/core/EuclideanDistance.html

У меня есть этот код:

      EuclideanDistance ed = new EuclideanDistance(finalInst);
      double dist;

      dist = ed.distance(finalInst.firstInstance(),finalInst.lastInstance());

finalInst является допустимым объектом Instances, который содержит допустимые объекты Instance ...

Вот первый и последний экземпляр, когда вы используете System.out.println:

finalInst.firstInstance():

?,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

finalInst.lastInstance():

?,?,?,?,1,1,?,1,?,1,?,?,1,?,?,?,?,?,1

Но затем, когда я запускаю код, он возвращает исключение нулевого указателя ...

Где я ошибся?

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

У меня есть два практических предложения:

1) Копайте код ВЕКА. Это открытый исходный код, так что вы можете добавить исходный код в свой проект Eclipse и просматривать соответствующие функции с помощью F3 (я надеюсь, что вы используете Eclipse или какую-то другую разумную IDE).

2) Реализуйте собственное евклидово расстояние. Это действительно просто. Вот, я даже сделал это для вас:

public double distance(List<Double> instance1, List<Double> instance2) {
    double dist = 0.0;

    for (int i = 0; i < instance1.size(); i++) {
        double x = instance1.get(i);
        double y = instance2.get(i);

        if (Double.isNaN(x) || Double.isNaN(y)) {
            continue; // Mark missing attributes ('?') as NaN.
        }

        dist += (x-y)*(x-y);
    }

    return Math.sqrt(dist);
}
1 голос
/ 13 декабря 2013

Старая тема, но: Вы должны передать объект Instances (который обычно происходит из файла ARFF) в конструктор EuclideanDistance. Повторное внедрение колеса обычно приводит к проблемам в будущем. Например, атрибуты могут быть номинальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...