Changeset 5736 for branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationSolution.cs
- Timestamp:
- 03/17/11 15:14:45 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationSolution.cs
r5717 r5736 39 39 [Item(Name = "SymbolicDiscriminantFunctionClassificationSolution", Description = "Represents a symbolic classification solution (model + data) and attributes of the solution like accuracy and complexity.")] 40 40 public sealed class SymbolicDiscriminantFunctionClassificationSolution : DiscriminantFunctionClassificationSolution, ISymbolicClassificationSolution { 41 private const string ModelLengthResultName = "ModelLength"; 42 private const string ModelDepthResultName = "ModelDepth"; 41 43 42 44 public new ISymbolicDiscriminantFunctionClassificationModel Model { … … 52 54 get { return Model; } 53 55 } 56 public int ModelLength { 57 get { return ((IntValue)this[ModelLengthResultName].Value).Value; } 58 private set { ((IntValue)this[ModelLengthResultName].Value).Value = value; } 59 } 54 60 61 public int ModelDepth { 62 get { return ((IntValue)this[ModelDepthResultName].Value).Value; } 63 private set { ((IntValue)this[ModelDepthResultName].Value).Value = value; } 64 } 55 65 [StorableConstructor] 56 66 private SymbolicDiscriminantFunctionClassificationSolution(bool deserializing) : base(deserializing) { } … … 60 70 public SymbolicDiscriminantFunctionClassificationSolution(ISymbolicDiscriminantFunctionClassificationModel model, IClassificationProblemData problemData) 61 71 : base(model, problemData) { 72 Add(new Result(ModelLengthResultName, "Length of the symbolic classification model.", new IntValue())); 73 Add(new Result(ModelDepthResultName, "Depth of the symbolic classification model.", new IntValue())); 74 RecalculateResults(); 62 75 } 63 76 … … 65 78 return new SymbolicDiscriminantFunctionClassificationSolution(this, cloner); 66 79 } 80 81 protected override void OnModelChanged(EventArgs e) { 82 base.OnModelChanged(e); 83 RecalculateResults(); 84 } 85 86 private new void RecalculateResults() { 87 ModelLength = Model.SymbolicExpressionTree.Length; 88 ModelDepth = Model.SymbolicExpressionTree.Depth; 89 } 90 91 public void ScaleModel() { 92 var dataset = ProblemData.Dataset; 93 var targetVariable = ProblemData.TargetVariable; 94 var rows = ProblemData.TrainingIndizes; 95 var estimatedValues = GetEstimatedValues(rows); 96 var targetValues = dataset.GetEnumeratedVariableValues(targetVariable, rows); 97 double alpha; 98 double beta; 99 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out alpha, out beta); 100 101 ConstantTreeNode alphaTreeNode = null; 102 ConstantTreeNode betaTreeNode = null; 103 // check if model has been scaled previously by analyzing the structure of the tree 104 var startNode = Model.SymbolicExpressionTree.Root.GetSubtree(0); 105 if (startNode.GetSubtree(0).Symbol is Addition) { 106 var addNode = startNode.GetSubtree(0); 107 if (addNode.SubtreesCount == 2 && addNode.GetSubtree(0).Symbol is Multiplication && addNode.GetSubtree(1).Symbol is Constant) { 108 alphaTreeNode = addNode.GetSubtree(1) as ConstantTreeNode; 109 var mulNode = addNode.GetSubtree(0); 110 if (mulNode.SubtreesCount == 2 && mulNode.GetSubtree(1).Symbol is Constant) { 111 betaTreeNode = mulNode.GetSubtree(1) as ConstantTreeNode; 112 } 113 } 114 } 115 // if tree structure matches the structure necessary for linear scaling then reuse the existing tree nodes 116 if (alphaTreeNode != null && betaTreeNode != null) { 117 betaTreeNode.Value *= beta; 118 alphaTreeNode.Value *= beta; 119 alphaTreeNode.Value += alpha; 120 } else { 121 var mainBranch = startNode.GetSubtree(0); 122 startNode.RemoveSubtree(0); 123 var scaledMainBranch = MakeSum(MakeProduct(beta, mainBranch), alpha); 124 startNode.AddSubtree(scaledMainBranch); 125 } 126 127 OnModelChanged(EventArgs.Empty); 128 } 129 130 private static ISymbolicExpressionTreeNode MakeSum(ISymbolicExpressionTreeNode treeNode, double alpha) { 131 if (alpha.IsAlmost(0.0)) { 132 return treeNode; 133 } else { 134 var node = (new Addition()).CreateTreeNode(); 135 var alphaConst = MakeConstant(alpha); 136 node.AddSubtree(treeNode); 137 node.AddSubtree(alphaConst); 138 return node; 139 } 140 } 141 142 private static ISymbolicExpressionTreeNode MakeProduct(double beta, ISymbolicExpressionTreeNode treeNode) { 143 if (beta.IsAlmost(1.0)) { 144 return treeNode; 145 } else { 146 var node = (new Multiplication()).CreateTreeNode(); 147 var betaConst = MakeConstant(beta); 148 node.AddSubtree(treeNode); 149 node.AddSubtree(betaConst); 150 return node; 151 } 152 } 153 154 private static ISymbolicExpressionTreeNode MakeConstant(double c) { 155 var node = (ConstantTreeNode)(new Constant()).CreateTreeNode(); 156 node.Value = c; 157 return node; 158 } 67 159 } 68 160 }
Note: See TracChangeset
for help on using the changeset viewer.