public void BuildDecisionTree(DataTable table, List<Attrib> attributes, Svazn relation) { //проходим по колонкам данных for (int i = 0; i < table.Columns.Count - 1; i++) { foreach (Attrib attribute in attributes)// { //находим атрибут соответствующей колонки if (table.Columns[i].Caption == attribute.attributeName) { //подсчитываем да, нет в каждой строке for (int j = 0; j < table.Rows.Count; j++) { foreach (Dannue option in attribute.options) { if (table.Rows[j][i].ToString() == option.optionName) { if (table.Rows[j].Field<string>("Play") == Const.Yes) { option.yesAmount++; } else if (table.Rows[j].Field<string>("Play") == Const.No) { option.noAmount++; } } } } ///////////// foreach (Dannue option in attribute.options) { //вызывается метод вычисление веса информации option.setInformationValue(); //если хоть да или нет = 0, то общий вес тоже = 0 if (Double.IsNaN(option.informationValue)) { option.informationValue = 0; } Console.WriteLine(option.informationValue); } //вычисляем среднее значение веса информации для всего атрибута attribute.setAverageInfVal(); Console.WriteLine(" " + attribute.averageInformationValue); } } } Attrib choosenAttribute = attributes[0]; //выбираем атрибут с максимальной весом информации for (int i = 1; i < attributes.Count; i++) { if (attributes[i].averageInformationValue > choosenAttribute.averageInformationValue) { choosenAttribute = attributes[i]; } } Console.WriteLine(" " + choosenAttribute.averageInformationValue); Console.WriteLine(Environment.NewLine + Environment.NewLine); List<Svazn> relations = new List<Svazn>(); DataTable dataTable; foreach (Dannue option in choosenAttribute.options) { if (option.informationValue != 0) { dataTable = table.Copy(); //проходим по строкам таблицы for (int i = 0; i < dataTable.Rows.Count; i++) { //выбираем одну опцию, удаляя строки, которые ее не содержат //оставляем строки содержащие требуемое значение (опцию) колонки (аттрибута) if (dataTable.Rows[i].Field<string>(choosenAttribute.attributeName) != option.optionName) { dataTable.Rows.Remove(dataTable.Rows[i]); i--; } } //добавляем ветки к дереву relations.Add(new Svazn(null, option.optionName, dataTable)); } else { string nodeData = ""; if (option.yesAmount == 0) { nodeData = Const.No; } else if (option.noAmount == 0) { nodeData = Const.Yes; } relations.Add(new Svazn(new TreeUzel(nodeData, null, null), option.optionName, null)); } } List<Attrib> tempAttributes = new List<Attrib>(); //выбираем все атрибуты, кроме максимального foreach (Attrib attribute in attributes) { if (attribute != choosenAttribute) { tempAttributes.Add(attribute); } } TreeUzel tempTreeNode = new TreeUzel(choosenAttribute.attributeName, relations, tempAttributes); //добавляем ветку в список веток дерева this.treeNodes.Add(tempTreeNode); if (relation != null) { relation.childNode = tempTreeNode; } foreach (Attrib attribute in attributes) { foreach (Dannue option in attribute.options) { option.yesAmount = 0; option.noAmount = 0; } attribute.averageInformationValue = 0; } //перебераем все все ветки и строим рекурсивно Decision tree для каждой зависимости foreach (Svazn newRelation in relations) { if (newRelation.childNode == null) { //рекурсия BuildDecisionTree(newRelation.dataTable, tempTreeNode.attributes, newRelation); } else { continue; } } }
public void PrintDecisionTree(TreeUzel treeNode) { if (treeNode.nodeData != Const.Yes && treeNode.nodeData != Const.No) { Console.WriteLine(treeNode.nodeData); } else { Console.WriteLine(" " + treeNode.nodeData); } if (treeNode.relations != null) { foreach (Svazn relation in treeNode.relations) { Console.WriteLine(" " + relation.childEdge); PrintDecisionTree(relation.childNode); } } }
public Svazn(TreeUzel childNode, string childEdge, DataTable dataTable) { this.childNode = childNode; this.childEdge = childEdge; this.dataTable = dataTable; }