Accord Machine学习knn.decide indexOutOfRangeException

时间:2017-06-01 08:45:33

标签: c# machine-learning indexoutofboundsexception accord.net

我正在尝试使用Accord库实现的k-nearest-neighbor。 首先,我用了

        double[][] inputs = new double[15000][];
        int[] outputs = new int[15000];

        for (int list_counter= 0; list_counter < training_set.Count; list_counter ++ ) {
            outputs[list_counter] = (char.Parse(training_set[list_counter].letter));

            double[] input = new double[16];
            for(int i =0; i< 16; i++) {
                input[i] = (double)training_set[list_counter].integers[i];
            }
            inputs[list_counter] = input;
        }

        var knn = new KNearestNeighbors(k: 4);
        knn.NumberOfInputs = 16;
        Console.WriteLine("Learning the algorithm");
        knn.Learn(inputs, outputs);

这段代码教knn算法,我有一组15000整数,我首先将其转换为double并用作输入。然后我有一个15000组的1个字符串我首先转换为char来获取整数值,然后将它们分类为输出。
输入和输出的一些屏幕截图。 Inputs Outputs

我还将输入数量设置为16以避免此类问题。 但是在这段代码上

            for (int list_counter = 0; list_counter < validation_set.Count; list_counter++) {
               double[] input = new double[16];
               for (int i = 0; i < 16; i++) {
                   input[i] = (double)validation_set[list_counter].integers[i];
               }
               int answer = knn.Decide(input); 

每当我尝试knn.decide时,我都会得到一个IndexOutOfRangeException。这看起来很奇怪,因为我使用完全相同的逻辑来插入输入(双[16]数组的数组[15000] 以下是程序崩溃Input before the crash

之前输入[]的屏幕截图

决定方法文档对我没有帮助,但我会留下链接:
knn decide documentation
knn documentation

编辑:stack trace

1 个答案:

答案 0 :(得分:1)

所以,这个特殊问题的答案很奇怪,我在knn算法的文档中找不到它。
问题是knn.Learn部分的输出必须从0开始并向上计数。将大写字符转换为int给了我至少65('A'),我改变了第一个代码

                outputs[list_counter] = (char.Parse(training_set[list_counter].letter)) -65 ;

现在一切都像钟表一样!