Weka Java API - Евклидово расстояние: нормализовано против ненормализовано

Я хочу вычислить нормированное евклидово расстояние между двумя векторами длиной 5. Более простой способ с Apache Math и RealVector не нормализует расстояние, поэтому я пытаюсь использовать Weka. Я следовал за кодом Java:

Attribute one = new Attribute("one");
Attribute two = new Attribute("two");
Attribute three = new Attribute("three");
Attribute four = new Attribute("four");
Attribute five = new Attribute("five");

FastVector attributes = new FastVector();
attributes.addElement(one);
attributes.addElement(two);
attributes.addElement(three);
attributes.addElement(four);
attributes.addElement(five);

Instances wVector = new Instances("Vector", attributes, 0);

Instance firstInstance = new Instance(attributes.size());
firstInstance.setDataset(wClassVector);
firstInstance.setValue(one, 1.0);
firstInstance.setValue(two, 2.0);
firstInstance.setValue(three, 3.0);
firstInstance.setValue(four, 4.0);
firstInstance.setValue(five, 5.0);

Instance secondInstance = new Instance(attributes.size());
secondInstance.setDataset(wClassVector);
secondInstance.setValue(one, 10.0);
secondInstance.setValue(two, 20.0);
secondInstance.setValue(three, 30.0);
secondInstance.setValue(four, 40.0);
secondInstance.setValue(five, 50.0);

EuclideanDistance ed = new EuclideanDistance(wClassVector);

Double wDist = ed.distance(firstInstance, secondInstance);

ed.setDontNormalize(true);
Double wDist1 = ed.distance(firstInstance, secondInstance);

Почему он рассчитывает не нормированное расстояние wDist1 правильное эфирное нормированное расстояние wDist получить NaN в результате?

1 ответ

Решение

Нормализация расстояния основана на диапазонах значений атрибутов экземпляров набора данных, с которым была создана функция расстояния.

Ваш wVector набор данных не содержит никаких экземпляров. Вы должны добавить экземпляры как это:

    wVector.add(firstInstance);
    wVector.add(secondInstance);

Тогда все должно работать как положено.

Другие вопросы по тегам