public Forest(int Trees, int DataSize, int Rounds, Func<int, DataSet> DataGenerator, Func<AttributeValue[]> EntryGenerator, Func<AttributeValue[], bool> Validator, int Target) { _Target = Target; for (int i = 0; i < Trees; ++i) { DataSet D = DataGenerator.Invoke(DataSize); _Trees.Add(new DecisionTree(D, Target)); _DataSets.Add(D); } for (int i = 0; i < Rounds; ++i) { Console.WriteLine(i); AttributeValue[] E = EntryGenerator.Invoke(); for (int j = 0; j < _Trees.Count; ++j) { AttributeValue Answer = _Trees[j].MakeDecision(E); E[Target] = Answer; if (!Validator.Invoke(E)) { Console.WriteLine("RECONSTRUCT TREE {0}", j); _DataSets[j].AddEntry(E); _Trees[j] = new DecisionTree(_DataSets[j], Target); } } } }
public DecisionTree(DataSet DataSet, int Target) { KeyValuePair<AttributeValue, bool> S = DataSet.SingularValue(Target); if (S.Value) _Value = S.Key; else { _Check = DataSet.BestGain(Target); if (_Check == null) { _Value = DataSet.MostCommonValue(Target); return; } _Children = new List<KeyValuePair<AttributeValue, DecisionTree>>(); List<AttributeValue> A = DataSet.SortedValues(_Check.Function); foreach (AttributeValue V in A) { DecisionTree C = new DecisionTree(DataSet.Subset(_Check.Function, V), Target); _Children.Add(new KeyValuePair<AttributeValue, DecisionTree>(V, C)); } } }
public void AddEntry(AttributeValue[] Entry) { foreach (DataSet D in _DataSets) D.AddEntry(Entry); for (int i = 0; i < _DataSets.Count; ++i) _Trees[i] = new DecisionTree(_DataSets[i], _Target); }
void BuildTree(DecisionTree tree) { treeView1.Nodes.Add(BuildTreeNode(tree.Root, String.Empty)); }