2

Accordライブラリが実装するk-nearest-neighborを使用しようとしています。すべての まず、私はAccord Machine Learning knn.decide indexOutOfRangeException

 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セットを持っています。それから私は最初に整数値を取得するためにcharに変換し、出力としてそれらを分類する1文字の文字列の15000セットがあります。
入力と出力のいくつかのスクリーンショット。 InputsOutputs

この種類の問題を避けるため、入力数を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

EDIT:stack trace

答えて

1

ので、この特定の問題に対する答えは奇妙である、と私はそれを見つけることができませんでしたドーズでknnアルゴリズムの説明。
問題はknn.Learn部分の出力が0から始まり、上向きにカウントされなければならないということでした。 intに資本文字を変換すると私の65の最小値を与えた(「A」)、私はコード

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

の最初の変更と今ではすべてが時計のように動作します!

関連する問題