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