如何使用weka从命令行计算最近邻居?

Mik*_*cki 9 nearest-neighbor weka

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

我想用weka而不是其他工具来做这件事.

Sem*_*ape 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.

     }
}
Run Code Online (Sandbox Code Playgroud)

现在只需使用以下命令从命令行运行它.

java -cp weka.jar;.WekaCLFindNN numNN csvfile

这是在我的机器上工作的屏幕截图.请注意,我在运行java时所在的目录中有weka.jar文件和WekaCLFindNN文件.另请注意,我在Windows下运行此操作,其中classpath separater是分号(;)如果您在Linux下运行它,则必须使用冒号(:)

weka从命令行工作

您可以忽略有关数据库驱动程序的部分,这只是Weka向stderr抛出的东西.但是你可以看到向量是左对齐的,它们最近的邻居就像你要求的那样被列出.

如果你想要一个日志文件中的数据只是这样执行它

java -cp weka.jar;.WekaCLFindNN> outputlog

日志文件将如下所示,并注意它没有关于数据库的错误:

outputlog

虽然在原始实例数据集中同时拥有最近邻居及其索引会很好,但我检查了kNearestNeighbours方法并发现索引数据在报告之前就被丢弃了.如果你想要它,你将不得不继承LinearNNSearch类并编写一个输出实例和索引的新方法.

所以我希望这会有所帮助.不幸的是,Weka并不提供开箱即用的功能,但你只需几行代码即可完成.