Weka keinen Einzeiler zu tun, was ich denke, Sie sind darauf hindeutet, (eine Datei aufnehmen, wandeln es Instanzen, und dann alle N nächsten Nachbarn jedes Exemplars finden)
aber Sie können festlegen eine Befehlszeile style one liner durch die Nutzung von Weka und ein paar Zeilen von Java in der folgenden Weise:
Kompilieren Sie den folgenden Code. Ich habe Eclipse verwendet, aber Sie können javac einfach in der Befehlszeile verwenden - stellen Sie einfach sicher, dass Sie weka.jar in Ihrem Klassenpfad haben. Ich zeige Ihnen ein Beispiel, wie unten
nach dem Code von der cammand Linie diese als Motto nennen
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.
}
}
Jetzt nur aus der Befehlszeile des folgenden Befehl verwenden.
java -cp weka.jar ;. WekaCLFindNN numNNcsvfile
hier ist ein Screenshot davon auf meiner Maschine arbeiten. Beachten Sie, dass ich die Datei weka.jar und die Datei WekaCLFindNN in dem Verzeichnis habe, in dem ich mich befinde, wenn ich Java starte. Beachten Sie auch, dass ich das unter Windows laufen lasse, wo der Classpath Trenner ist ein Semikolon (;), wenn Sie diese unter Linux liefen würden Sie einen Doppelpunkt (:)
verwenden, um Sie können den Teil ignorieren über den Datenbanktreiber, der gerade Weka etwas zu stderr wirft. Aber wie Sie sehen können, sind die Vektoren linksbündig und ihre nächsten Nachbarn sind genau so aufgeführt, wie Sie es verlangt haben.
wenn Sie die Daten in einer Protokolldatei wollen führen Sie einfach es auf diese Weise
java -cp weka.jar ;. WekaCLFindNN> outputlog
die Log-Datei wird wie folgt aussehen, und merken es nicht den Fehler über die Datenbank hat:
Während es sowohl die nächsten Nachbarn zu haben wäre schön und ihr Index im ursprünglichen Instanz-Dataset. Ich habe die kNearestNeighbours-Methode überprüft und festgestellt, dass die Indexdaten direkt vor der Berichterstellung gelöscht werden. Wenn Sie es wollen, müssen Sie die LinearNNSearch-Klasse erben und eine neue Methode schreiben, die sowohl die Instanzen als auch die Indizes ausgibt.
Also ich hoffe, das hilft. Es ist schade, dass Weka dies nicht sofort anbietet, aber Sie können es in ein paar Zeilen Code machen.