2017-08-22 13 views
5

Używam Accord.net 3.7.0 w dot net core 1.1.Accord.net NaiveBayesLearning "Indeks był poza obszarem tablicy"

Algorytm, którego używam, to naiwny bayesian. A kod źródłowy mechanizmu uczenia się następująco:

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; 
    } 

Ja testowałem ten fragment kodu na trochę danych, ale także dane wzrósł indeks

był poza granice tablicy

Wystąpił błąd.

Ponieważ nie mogę nawigować w metodzie Learn, więc nie wiem, co zrobić. Zrzut ekranu z run-time jest taka:

Run-time error screen shot

Bez dodatkowych informacji, nie wewnętrzny wyjątek ma pojęcia !!!

TG.

// UPDATE_1 ***

Tablica wejść jest o 4 180 matrycy (array), co poniżej przedstawiono zdjęcie:

Inputs

posiadającą 4 kolumn w każdym wierszu. sprawdzane ręcznie (mogę udostępnić swój film zbyt jeśli potrzebna !!!)

Tablica wyjścia jest 180 jedno, jak pokazano tutaj:

Outputs

który zawiera tylko 0 i 1 (mogę podzielić w razie potrzeby także jego wideo !!!).

I o NaiveBayesinLearning doc jest tutaj:

NaiveBayesinLearning

Więcej przykładów na dole tej strony:

More examples

I docs learn metoda tutaj:

learn method doc

+0

Myślę, że moglibyśmy zgadywać tak samo jak ty, być może bardziej. Czy twoja tablica "input" jest prostokątna? Jaką dokumentację masz na temat "Learn"? Czy spodziewa się, że tablica wyjść ma taką samą długość jak konkretna tablica wejściowa itd. Może zajść potrzeba dekompilacji kodów bibliotecznych dla tej metody "Ucz się", abyś mógł zobaczyć, jak uzyskuje dostęp do tablic. –

+0

Nie widzimy kodu, który wyrzuca wyjątek, nie wiemy, co przekazujesz tej metodzie, ale możemy się domyślić, dlaczego się nie udało? – oerkelens

+0

@CaiusJard Być może ktoś napotkał to wcześniej. Ale też dobrze jest przetestować twoje domysły. Tak w tym przykładzie dane wejściowe to tablica 180 na 4, a wynik to 180 wektor. – ConductedClever

Odpowiedz

3

Zgodnie z uwagami i Pomysłami od nich podejrzewałem o wartości macierzy. Więc ja badali go:

problem

Jak widać na zdjęciu powyżej, niektóre wiersze mają poniżej wartości zerowych.Matryca wejścia są generowane przez Ujednolicenie, który jest używany w przykładach tutaj:

NaiveBayes

z Dokumenty poniżej:

Codification docs

ujednolicenie -1 się z wartościami null. Podobnie jak zrzut ekranu poniżej:

one of problematic records

Więc mój roztwór zastępując null wartości z "null". Ale może być lepsze rozwiązania.

Teraz metoda rozmówca, który zawiera dane stały się następująco:

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; 
    } 

życzę pomoże innym napotykają ten sam problem.

+2

Właściwe rozwiązanie zależy od tego, jak chcesz radzić sobie z wartościami pustymi. Filtr kodyfikacji może być skonfigurowany tak, aby mapował wartości null do pewnej z góry określonej wartości za pośrednictwem właściwości "DefaultMissingValueReplacement". Istnieją jednak inne możliwe strategie, takie jak usuwanie zmiennych (kolumn) lub instancji (wierszy), w których mogą występować wartości puste. To jedyny powód, dla którego framework nie obsługuje ich automatycznie, ale na pewno wyjątek powinien mieć lepszą wiadomość! – Cesar

+0

@ Cezar, ponieważ algorytmy uczenia się mają problem z wartościami ujemnymi, myślę, że lepiej jest, aby kodowanie było skonfigurowane tak, aby nie używać -1 jako domyślnego lub, jak wspomniano, mieć lepszy komunikat wyjątku. – ConductedClever

+0

@ Cezar Przetestowałem ten fragment kodu "Kodekcja kodowania = nowa Kodyfikacja (featureTitles, learningInputNotCodified) { DefaultMissingValueReplacement = 0 };' ale nadal generuje -1 w miejsce wartości pustych. Czy mógłbyś napisać odpowiedni kod? Dzięki. – ConductedClever

Powiązane problemy