2015-07-10 21 views
9

Ho un file csv, dove ogni riga è un vettore di numeri che rappresentano un punto dati. Voglio usare weka dalla riga di comando per calcolare il vicino più prossimo di ogni punto di dati nel file csv. So come classificare k vicino più vicino dalla riga di comando, ma non è quello che voglio. Voglio i veri vicini. Come faccio a fare questo?Come calcolare i vicini più vicini usando weka dalla riga di comando?

voglio farlo usando weka e non qualche altro strumento.

risposta

5

Weka non hai uno di linea per fare quello che io penso che lei suggerisce (ingerire un file, convertirlo in casi, e poi trovare tutte le N primi vicini di ciascuna istanza)

ma è possibile impostare uno stile di linea a linea di comando facendo leva su Weka e un paio di linee di Java nel modo seguente:

Compilare il seguente codice. Ho usato Eclipse, ma puoi anche usare javac alla riga di comando con la stessa facilità: assicurati di avere weka.jar nel classpath. Vi mostro un esempio di come chiamare questo come un uno di linea dalla linea cammand dopo il codice qui sotto

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. 

    } 
} 

Ora basta eseguirlo dalla riga di comando utilizzando il seguente comando.

java -cp weka.jar ;. WekaCLFindNN numNNcsvfile

ecco un colpo di schermo che funziona sulla mia macchina. Nota che ho il file weka.jar e il file WekaCLFindNN nella directory I am in quando eseguo java. Si noti inoltre che sto facendo funzionare questo sotto Windows in cui il separatore percorso di classe è un punto e virgola (;) se si stesse eseguendo questo sotto Linux si dovrà utilizzare i due punti (:)

weka working from command line

È possibile ignorare la parte riguardo al driver del database che è solo Weka che lancia qualcosa allo stderr. ma come puoi vedere i vettori sono allineati a sinistra e i loro vicini più vicini sono elencati come hai chiesto tu.

se si desidera che i dati in un file di log solo eseguirlo in questo modo

java -cp weka.jar ;. WekaCLFindNN> OutputLog

il file di log sarà simile a questa, e notare che non ha l'errore sul database:

outputlog

Anche se sarebbe bello avere entrambe i vicini più vicini e il loro indice nel set di dati dell'istanza originale, ho controllato il metodo kNearestNeighbours e ho scoperto che i dati dell'indice sono stati gettati via prima del reporting. Se lo vuoi, allora dovrai ereditare la classe LinearNNSearch e scrivere un nuovo metodo che produca sia le istanze che gli indici.

quindi spero che questo aiuta. E 'un peccato che Weka non lo offra fin da subito, ma puoi farlo in poche righe di codice.

Problemi correlati