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

How to calculate the nearest neighbors using weka from the command line?

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

我想使用 weka 而不是其他工具。

Weka 没有单行代码来执行我认为您的建议(获取文件,将其转换为实例,然后找到每个实例的所有 N 个最近邻居)

但您可以通过以下方式利用 Weka 和几行 Java 来设置命令行样式的一行代码:

Compile the following code. I used Eclipse, but you can just as easily use javac at the command line - just make sure that you have weka.jar in your classpath. I show you an example of how to call this as a one liner from the cammand line after the code below

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 numNN csvfile

这是它在我的机器上运行的屏幕截图。请注意,当我 运行 java 时,我所在的目录中有 weka.jar 文件和 WekaCLFindNN 文件。另请注意,我在 Windows 下 运行 宁此,其中 class 路径分隔符是分号 (;) 如果您在 Linux 下 运行宁此必须使用冒号 (:)

您可以忽略有关数据库驱动程序的部分,这只是 Weka 向 stderr 抛出一些东西。但正如您所看到的那样,矢量左对齐,并且按照您的要求列出了最近的邻居。

如果你想要日志文件中的数据就这样执行

java -cp weka.jar;. WekaCLFindNN > outputlog

日志文件看起来像这样,注意它没有关于数据库的错误:

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

希望对您有所帮助。很遗憾,Weka 没有提供开箱即用的功能,但您只需几行代码即可完成。