2017-06-01 142 views
2

我試圖使用Accord庫實現的k最近鄰居。所有的 首先,我使用Accord機器學習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整數集,這是我首先轉換到加倍和用作輸入的。然後我有一個15000個1字符串的集合,我首先將其轉換爲char來獲取整數值,然後將它們分類爲輸出。
輸入和輸出的一些屏幕截圖。 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

編輯:stack trace

回答

1

所以,這個問題的答案特定問題很奇怪,我無法找到它在做Knn算法的裝備。
問題是knn.Learn零件上的輸出必須從0開始並向上計數。將首字符轉換爲int給了我至少65('A'),我改變了第一個代碼

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

現在一切都像發條一樣運行!