2015-07-10 2 views
9

Ich habe eine CSV-Datei, wobei jede Zeile ein Vektor von Zahlen ist, die einen Datenpunkt darstellen. Ich möchte Weka von der Befehlszeile verwenden, um den nächsten Nachbarn jedes Datenpunkts in der CSV-Datei zu berechnen. Ich weiß, wie man k nearest neighbor-Klassifikation von der Kommandozeile aus macht, aber das ist nicht das, was ich will. Ich will die tatsächlichen Nachbarn. Wie mache ich das?Wie berechnet man die nächsten Nachbarn mit Weka von der Kommandozeile aus?

Ich möchte dies mit Weka und nicht ein anderes Werkzeug tun.

Antwort

5

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 (:)

weka working from command line

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:

outputlog

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.

Verwandte Themen