Как рассчитать ближайших соседей с помощью Weka из командной строки?

У меня есть файл csv, где каждая строка представляет собой вектор чисел, представляющих точку данных. Я хочу использовать weka из командной строки для вычисления ближайшего соседа каждой точки данных в csv-файле. Я знаю, как сделать классификацию k ближайших соседей из командной строки, но это не то, что я хочу. Мне нужны настоящие соседи. Как мне это сделать?

Я хочу сделать это с помощью weka, а не какого-либо другого инструмента.

1 ответов


У Weka нет одного лайнера, чтобы сделать то, что я думаю, что вы предлагаете (проглотить файл, преобразовать его в экземпляры, а затем найти все N ближайших соседей каждого экземпляра)

но вы можете настроить стиль командной строки один лайнер, используя Weka и пару строк Java следующим образом:

скомпилируйте следующий код. Я использовал Eclipse, но вы можете так же легко использовать и javac в командной строке - просто убедитесь, что у вас есть weka.Джар в вашем classpath. Я покажу вам пример того, как назвать это одним лайнером из строки cammand после кода ниже

import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
import weka.core.neighboursearch.LinearNNSearch;

public class WekaCLFindNN {
     public static void main(String[] args) throws Exception {

            //report that the code is running
            System.out.println("Weka Command Line Find Nearest " + args[0] + " Neighbors for each Instance in "  + args[1]); // Display the string.

            //setup datasources, grab instances, and calculate the nearest neighbors
            DataSource source = new DataSource(""+args[1]);
            Instances instances = source.getDataSet();  
            weka.core.neighboursearch.LinearNNSearch knn = new LinearNNSearch(instances);

            //cycle through the dataset and get instances for the nearestneighbors
            for(int j=0;j<instances.numInstances();j++){
            Instances nearestInstances= knn.kNearestNeighbours(instances.instance(j), Integer.parseInt(args[0]));

            //cycle through the instances and printout the nearestneighbors
            System.out.println("\n\n" + instances.instance(j));
            for(int i =0;i<Integer.parseInt(args[0]);i++) 
            {
                System.out.println("\n\t" + nearestInstances.instance(i));

            }

            }

            //close the code
            System.out.println("\n"+"Nearest Neighbors found"); // Display the string.

     }
}

теперь просто запустите его из командной строки с помощью следующей команды.

java-cp weka.сосуд.; WekaCLFindNN numNN csvfile, был

вот снимок экрана, на котором он работает на моей машине. Обратите внимание, что у меня есть weka.файл jar и файл WekaCLFindNN в каталоге, в котором я нахожусь, Когда я запускаю java. Также обратите внимание, что я запускаю это под Windows, где разделитель пути к классам-точка с запятой (;) если вы запускаете это под Linux, вам придется использовать двоеточие (:)

weka working from command line

вы можете игнорировать часть о драйвере базы данных, которая просто Weka выбрасывает что-то в stderr. но, как вы можете видеть, векторы выровнены слева, а их ближайшие соседи перечислены так же, как вы просили.

Если вы хотите данные в файле журнала просто выполните его таким образом

java-cp weka.сосуд.; WekaCLFindNN > outputlog

файл журнала будет выглядеть так, и обратите внимание, что у него нет ошибки о базе данных:

outputlog

хотя было бы неплохо иметь как ближайших соседей, так и их индекс в исходном наборе данных экземпляра, я проверил метод kNearestNeighbours и обнаружил, что данные индекса выбрасываются прямо перед отчетностью. Если вы хотите этого, вам придется наследовать класс LinearNNSearch и написать новый метод, который выводит как экземпляры, так и индексы.

поэтому я надеюсь, что это поможет. К сожалению, Weka не предлагает это из коробки, но вы можете сделать это всего за несколько строк кода.