2015-07-10 115 views
9

我有一个csv文件,其中每一行是表示数据点的数字矢量。我想使用命令行中的weka来计算csv文件中每个数据点的最近邻居。我知道如何从命令行做k近邻分类,但这不是我想要的。我想要实际的邻居。我该怎么做呢?如何使用weka从命令行计算最近的邻居?

我想使用weka而不是其他工具来做到这一点。

回答

5

Weka中没有一个班轮做什么,我认为你的建议(摄取文件,将其转换为实例,然后找到所有每个实例的N个最近的邻居)

,但你可以设置通过以下方式利用Weka和几行Java来提高命令行风格:

编译以下代码。我使用Eclipse,但是您可以在命令行轻松使用javac - 只需确保在类路径中有weka.jar。我告诉你如何代码之后调用此作为一个衬垫从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.jar ;. WekaCLFindNN numNNcsvfile

这里是它的屏幕截图我的机器上工作。请注意,当我运行java时,我在我所在的目录中有weka.jar文件和WekaCLFindNN文件。还要注意的是,我的Windows在类路径分隔符号是分号下运行这个(;)如果你在Linux下运行这一点,你将不得不使用一个冒号(:)

weka working from command line

可以忽略的部分关于数据库驱动程序,只是Weka向stderr抛出一些东西。但正如你所看到的,这些矢量是左对齐的,而他们最近的邻居就像你所要求的一样。

,如果你想在一个日志文件中的数据只是执行这种方式

java命令weka.jar ;. WekaCLFindNN> outputlog

日志文件将这个样子,并注意它不具有对数据库中的错误:

outputlog

虽然这将是不错的两个最近的邻居以及它们在原始实例数据集中的索引,我检查了kNearestNeighbours方法,发现索引数据在报告之前即被丢弃。如果你想要它,你将不得不继承LinearNNSearch类并编写一个输出实例和索引的新方法。

所以我希望这有助于。很遗憾Weka不提供这种开箱即用的功能,但只需几行代码即可完成。