Как рассчитать ближайших соседей с помощью 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 выбрасывает что-то в stderr. но, как вы можете видеть, векторы выровнены слева, а их ближайшие соседи перечислены так же, как вы просили.
Если вы хотите данные в файле журнала просто выполните его таким образом
java-cp weka.сосуд.; WekaCLFindNN > outputlog
файл журнала будет выглядеть так, и обратите внимание, что у него нет ошибки о базе данных:
хотя было бы неплохо иметь как ближайших соседей, так и их индекс в исходном наборе данных экземпляра, я проверил метод kNearestNeighbours и обнаружил, что данные индекса выбрасываются прямо перед отчетностью. Если вы хотите этого, вам придется наследовать класс LinearNNSearch и написать новый метод, который выводит как экземпляры, так и индексы.
поэтому я надеюсь, что это поможет. К сожалению, Weka не предлагает это из коробки, но вы можете сделать это всего за несколько строк кода.