2017-08-22 15 views
5

ドットネットコア1.1でAccord.net 3.7.0を使用しています。Accord.net NaiveBayesLearning "インデックスが配列の境界外にありました"

私が使用するアルゴリズムはナイーブなベイジアンです。次のように学習メカニズムのソースコードは次のとおりです。

public LearningResultViewModel NaiveBayes(int[][] inputs, int[] outputs) 
    { 
     // Create a new Naive Bayes learning 
     var learner = new NaiveBayesLearning(); 

     // Learn a Naive Bayes model from the examples 
     NaiveBayes nb = learner.Learn(inputs, outputs); 

     #region test phase 
     // Compute the machine outputs 
     int[] predicted = nb.Decide(inputs); 

     // Use confusion matrix to compute some statistics. 
     ConfusionMatrix confusionMatrix = new ConfusionMatrix(predicted, outputs, 1, 0); 
     #endregion 

     LearningResultViewModel result = new LearningResultViewModel() 
     { 
      Distributions = nb.Distributions, 
      NumberOfClasses = nb.NumberOfClasses, 
      NumberOfInputs = nb.NumberOfInputs, 
      NumberOfOutputs = nb.NumberOfOutputs, 
      NumberOfSymbols = nb.NumberOfSymbols, 
      Priors = nb.Priors, 
      confusionMatrix = confusionMatrix 
     }; 

     return result; 
    } 

私は少しのデータにコードのこの部分をテストしているが、データが増加したとして

インデックスが配列の境界外です

エラーが発生しました。

私はLearnメソッドでナビゲートできませんので、何をすべきかわかりません。実行時のスクリーンショットはこれです:

Run-time error screen shot

エキストラ情報、ノー内部例外なしIDEA!

TG。

// UPDATE_1蛇腹画像が示すように***

入力アレイは、180×4行列(配列)である。

Inputs

各行に4列を有します。ここに示すように、手(必要であれば、私はあまりにもそのビデオを共有することができます!!!)

によって確認された出力配列は180です:

Outputs

のみ0と1(私は共有することができますが含まれていますそのビデオも必要ならば!!!)。

そしてNaiveBayesinLearningドキュメントについて

はここにある:このページの

NaiveBayesinLearning

より多くの例底部:

More examples

そしてここlearnメソッドのドキュメント:

learn method doc

+0

私はあなたのことを推測しているかもしれないと思うかもしれません。あなたの 'inputs'配列は長方形ですか? 'Learn'についてのドキュメントはありますか?出力配列が特定の入力配列などと同じ長さであることを期待していますか?その 'Learn'メソッドのライブラリコードを逆コンパイルして、どのように配列にアクセスするのかを確認する必要があります –

+0

throwするコード例外として、あなたはそのメソッドに渡すものはわかりませんが、なぜ失敗するのか推測できますか? – oerkelens

+0

@CaiusJard前に遭遇したことがあるかもしれません。しかし、私はあなたの推測をテストすることも大丈夫です。はい、この例では、入力は180×4の配列で、出力は180のベクトルです。 – ConductedClever

答えて

3

コメントと彼らからのアイデアによると、私はマトリックスの価値を疑っています。だから私はそれを検討しています

problem

を上記の画像に示すように、いくつかの行は、ゼロ値の下に持っています。入力行列は、ここでの例で使用されて編纂することによって生成される:以下ドキュメントと

NaiveBayes

Codification docs

編纂-1ヌルの値でした。画面のように、以下のショット:

one of problematic records

をだから私のソリューションは"null"null値を置き換えました。しかし、よりよい解決策があるかもしれません。次のように

今すぐ固定データが含まれている呼び出し元メソッドは次のとおりです。

public LearningResultViewModel Learn(EMVDBContext dBContext, string userId, LearningAlgorithm learningAlgorithm) 
    { 
     var learningDataRaw = dBContext.Mutants 
      .Include(mu => mu.MutationOperator) 
      .Where(mu => mu.Equivalecy == 0 || mu.Equivalecy == 10); 

     string[] featureTitles = new string[] { 
     "ChangeType", 
     "OperatorName", 
     "OperatorBefore", 
     "OperatorAfter", 
     }; 

     string[][] learningInputNotCodified = learningDataRaw.Select(ldr => new string[] { 
      ldr.ChangeType.ToString(), 
      ldr.MutationOperator.Name??"null", 
      ldr.MutationOperator.Before??"null", 
      ldr.MutationOperator.After??"null", 
     }).ToArray(); 

     int[] learningOutputNotCodified = learningDataRaw.Select(ldr => ldr.Equivalecy == 0 ? 0 : 1).ToArray(); 

     #region Codification phase 
     // Create a new codification codebook to 
     // convert strings into discrete symbols 
     Codification codebook = new Codification(featureTitles, learningInputNotCodified); 

     // Extract input and output pairs to train 
     int[][] learningInput = codebook.Transform(learningInputNotCodified); 

     switch (learningAlgorithm) 
     { 
      case LearningAlgorithm.NaiveBayesian: 
       return learningService.NaiveBayes(learningInput, learningOutputNotCodified); 
       break; 
      case LearningAlgorithm.SVM: 
       break; 
      default: 
       break; 
     } 
     #endregion 

     return null; 
    } 

私はこれが同じ問題に遭遇した人を助けるだろう願っています。

+2

適切な解決策は、どのようにnull値を処理するかによって異なります。コード化フィルタは、その「DefaultMissingValueReplacement」プロパティを通じてヌル値を所定の値にマッピングするように構成することができる。ただし、null値が発生する可能性のある変数(列)やインスタンス(行)の削除など、他にも可能な戦略があります。それがフレームワークが自動的にそれらを処理しない唯一の理由ですが、確かに例外はより良いメッセージを持っていたはずです! – Cesar

+0

@Cesarは学習アルゴリズムが負の値に問題を抱えているため、コード化がデフォルトとして-1を使用しないように設定する方が良いと思っています。 – ConductedClever

+0

@Cesar私はこのコードをテストしましたが、それでもヌル値の代わりに-1が生成されています。コード化コードブック=新しいコード化(featureTitles、learningInputNotCodified) { DefaultMissingValueReplacement = 0 }あなたは正しいコードを書いてください。ありがとう。 – ConductedClever

関連する問題