2015-05-02 3 views
2

Я следующий пример на сайте Accord.net к письму:Воссоздание Accord.NET DecisionTree сайт пример - Учитывая ключи не присутствуют в словаре

Link to the example, scroll to the bottom

Мой код является копией кода на веб-сайте. У меня есть правильные пакеты NuGet.

DataTable data = new DataTable("Mitchell's Tennis Example"); 

       data.Columns.Add("Day", "Outlook", "Temperature", "Humidity", "Wind", "PlayTennis"); 

       data.Rows.Add("D1", "Sunny", "Hot", "High", "Weak", "No"); 
       data.Rows.Add("D2", "Sunny", "Hot", "High", "Strong", "No"); 
       data.Rows.Add("D3", "Overcast", "Hot", "High", "Weak", "Yes"); 
       data.Rows.Add("D4", "Rain", "Mild", "High", "Weak", "Yes"); 
       data.Rows.Add("D5", "Rain", "Cool", "Normal", "Weak", "Yes"); 
       data.Rows.Add("D6", "Rain", "Cool", "Normal", "Strong", "No"); 
       data.Rows.Add("D7", "Overcast", "Cool", "Normal", "Strong", "Yes"); 
       data.Rows.Add("D8", "Sunny", "Mild", "High", "Weak", "No"); 
       data.Rows.Add("D9", "Sunny", "Cool", "Normal", "Weak", "Yes"); 
       data.Rows.Add("D10", "Rain", "Mild", "Normal", "Weak", "Yes"); 
       data.Rows.Add("D11", "Sunny", "Mild", "Normal", "Strong", "Yes"); 
       data.Rows.Add("D12", "Overcast", "Mild", "High", "Strong", "Yes"); 
       data.Rows.Add("D13", "Overcast", "Hot", "Normal", "Weak", "Yes"); 
       data.Rows.Add("D14", "Rain", "Mild", "High", "Strong", "No"); 

       // Create a new codification codebook to 
       // convert strings into integer symbols 
       Codification codebook = new Codification(data); 

       // Translate our training data into integer symbols using our codebook: 
       DataTable symbols = codebook.Apply(data); 
       int[][] inputs = symbols.ToArray<int>("Outlook", "Temperature", "Humidity", "Wind"); 
       int[] outputs = symbols.ToArray<int>("PlayTennis"); 

       // Gather information about decision variables 
       DecisionVariable[] attributes = 
    { 
     new DecisionVariable("Outlook",  3), // 3 possible values (Sunny, overcast, rain) 
     new DecisionVariable("Temperature", 3), // 3 possible values (Hot, mild, cool) 
     new DecisionVariable("Humidity", 2), // 2 possible values (High, normal)  
     new DecisionVariable("Wind",  2) // 2 possible values (Weak, strong) 
    }; 

       int classCount = 2; // 2 possible output values for playing tennis: yes or no 

       //Create the decision tree using the attributes and classes 
       DecisionTree tree = new DecisionTree(attributes, classCount); 

       // Create a new instance of the ID3 algorithm 
       ID3Learning id3learning = new ID3Learning(tree); 

       // Learn the training instances! 
       id3learning.Run(inputs, outputs); 

       string answer = codebook.Translate("PlayTennis", 
        tree.Compute(codebook.Translate("Sunny", "Hot", "High", "Strong"))); 

       Console.WriteLine("Calculate for: Sunny, Hot, High, Strong"); 
       Console.WriteLine("Answer: " + answer); 

Я получаю это исключение:

The given key was not present in the dictionary. 

В этой строке кода:

string answer = codebook.Translate("PlayTennis", 
       tree.Compute(codebook.Translate("Sunny", "Hot", "High", "Strong"))); 

С чего начать решить эту проблему? Я проверил кодовую книгу в отладчике, и он содержит такие элементы, как должен.

+0

Спасибо за вопрос. Вместо того, чтобы создавать словарь как «Кодификационная кодовая книга = новая кодировка (данные)», создайте ее как «Кодификационная кодовая кодировка = новая кодировка (данные,« Outlook »,« Температура »,« Влажность »,« Ветер »,« PlayTennis ») ;» явно передавая столбцы. Я обновлю документацию. – Cesar

+1

Я бы порекомендовал разместить ответ вместо комментария. Спасибо за поддержку! – ManyQuestions

ответ

3

Кажется, что документация по рамочной системе немного устарела. Вместо создания словаря как

Codification codebook = new Codification(data); 

рамки теперь ожидает, что пользователю передавать столбцы, представляющие интерес в конструкторе кодификация в. Таким образом, словарь кодирования теперь должен быть создан как

Codification codebook = new Codification(data, 
    "Outlook", "Temperature", "Humidity", "Wind", "PlayTennis"); 

Документация будет перестроена через несколько дней!