public DecisionSystem GetSubset(string decisionClassName, string attributeName) { int classNumber; for (classNumber = 1; classNumber < Records[0].Length - 1; classNumber++) { if (Records[0][classNumber] == decisionClassName) { break; } } var recordsList = new List <string[]>(); recordsList.Add(Records[0]); for (int i = 1; i < Records.Length; i++) { if (Records[i][classNumber] == attributeName) { recordsList.Add(Records[i]); } } var subset = new DecisionSystem(); subset.Records = recordsList.ToArray(); return(subset); }
public DecisionSystem GetSubset(string decisionClassName, string attributeName) { int classNumber; for (classNumber = 1; classNumber < Records[0].Length - 1; classNumber++) if (Records[0][classNumber] == decisionClassName) break; var recordsList = new List<string[]>(); recordsList.Add(Records[0]); for (int i = 1; i < Records.Length; i++) if (Records[i][classNumber] == attributeName) recordsList.Add(Records[i]); var subset = new DecisionSystem(); subset.Records = recordsList.ToArray(); return subset; }
private Leaf build(DecisionSystem ds, DecisionClassAttribute parentLink) { var leaf = new Leaf { ParentLink = parentLink }; // an end of recursion // if entropy equals 0 decision is deterministic if (parentLink != null && parentLink.Entropy == 0) { return(leaf); } // divide decision system into decision classes, assuming that // first row contains labels, // first column contains ordinal, // last column contains decision var records = ds.Records; var decisionClasses = new List <DecisionClass>(); var decisionsVector = ds. GetDecisionClassVector(ds.Records[0].Length - 1); for (int i = 1; i < records[0].Length - 1; i++) { var decisionClassVector = ds.GetDecisionClassVector(i); var dc = new DecisionClass(decisionClassVector, decisionsVector); decisionClasses.Add(dc); } decisionClasses.ForEach(x => x.BuildAttributesList()); // sort decision classes by their gain decisionClasses.Sort(); // get class with the highest gain as a leaf leaf.DecisionClass = decisionClasses.Last(); // we continue to build tree, // searching for the next decision class for leaf foreach (var attribute in leaf.DecisionClass.Attributes) { var subset = ds.GetSubset(leaf.DecisionClass.Name, attribute.AttributeName); leaf.Children.Add(build(subset, attribute)); } return(leaf); }
private Leaf build(DecisionSystem ds, DecisionClassAttribute parentLink) { var leaf = new Leaf { ParentLink = parentLink }; // an end of recursion // if entropy equals 0 decision is deterministic if (parentLink != null && parentLink.Entropy == 0) return leaf; // divide decision system into decision classes, assuming that // first row contains labels, // first column contains ordinal, // last column contains decision var records = ds.Records; var decisionClasses = new List<DecisionClass>(); var decisionsVector = ds. GetDecisionClassVector(ds.Records[0].Length - 1); for (int i = 1; i < records[0].Length - 1; i++) { var decisionClassVector = ds.GetDecisionClassVector(i); var dc = new DecisionClass(decisionClassVector, decisionsVector); decisionClasses.Add(dc); } decisionClasses.ForEach(x => x.BuildAttributesList()); // sort decision classes by their gain decisionClasses.Sort(); // get class with the highest gain as a leaf leaf.DecisionClass = decisionClasses.Last(); // we continue to build tree, // searching for the next decision class for leaf foreach (var attribute in leaf.DecisionClass.Attributes) { var subset = ds.GetSubset(leaf.DecisionClass.Name, attribute.AttributeName); leaf.Children.Add(build(subset, attribute)); } return leaf; }
public static void Main(string[] args) { string outputFileName = "graph.dot"; if (args.Length == 0) { printHelp(); return; } for (int i = 1; i < args.Length; i++) { switch (args[i]) { case "--output-file-name": i++; outputFileName = args[i]; break; default: break; } } string path = args[0]; var ds = new DecisionSystem(); ds.Load(path); var tree = new DecisionTree(); tree.Build(ds); var graph = new DecisionTreeGraph(tree); graph.BuildGraph(); graph.DrawGraph(outputFileName); }
public void Build(DecisionSystem ds) { Root = build(ds, null); }