Changeset 8664 for trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs
- Timestamp:
- 09/17/12 11:18:40 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicClassificationModel.cs
r8623 r8664 62 62 return CreateClassificationSolution(problemData); 63 63 } 64 65 #region scaling66 public static void Scale(ISymbolicClassificationModel model, IClassificationProblemData problemData) {67 var dataset = problemData.Dataset;68 var targetVariable = problemData.TargetVariable;69 var rows = problemData.TrainingIndices;70 var estimatedValues = model.Interpreter.GetSymbolicExpressionTreeValues(model.SymbolicExpressionTree, dataset, rows);71 var targetValues = dataset.GetDoubleValues(targetVariable, rows);72 double alpha;73 double beta;74 OnlineCalculatorError errorState;75 OnlineLinearScalingParameterCalculator.Calculate(estimatedValues, targetValues, out alpha, out beta, out errorState);76 if (errorState != OnlineCalculatorError.None) return;77 78 ConstantTreeNode alphaTreeNode = null;79 ConstantTreeNode betaTreeNode = null;80 // check if model has been scaled previously by analyzing the structure of the tree81 var startNode = model.SymbolicExpressionTree.Root.GetSubtree(0);82 if (startNode.GetSubtree(0).Symbol is Addition) {83 var addNode = startNode.GetSubtree(0);84 if (addNode.SubtreeCount == 2 && addNode.GetSubtree(0).Symbol is Multiplication && addNode.GetSubtree(1).Symbol is Constant) {85 alphaTreeNode = addNode.GetSubtree(1) as ConstantTreeNode;86 var mulNode = addNode.GetSubtree(0);87 if (mulNode.SubtreeCount == 2 && mulNode.GetSubtree(1).Symbol is Constant) {88 betaTreeNode = mulNode.GetSubtree(1) as ConstantTreeNode;89 }90 }91 }92 // if tree structure matches the structure necessary for linear scaling then reuse the existing tree nodes93 if (alphaTreeNode != null && betaTreeNode != null) {94 betaTreeNode.Value *= beta;95 alphaTreeNode.Value *= beta;96 alphaTreeNode.Value += alpha;97 } else {98 var mainBranch = startNode.GetSubtree(0);99 startNode.RemoveSubtree(0);100 var scaledMainBranch = MakeSum(MakeProduct(mainBranch, beta), alpha);101 startNode.AddSubtree(scaledMainBranch);102 }103 }104 105 private static ISymbolicExpressionTreeNode MakeSum(ISymbolicExpressionTreeNode treeNode, double alpha) {106 if (alpha.IsAlmost(0.0)) {107 return treeNode;108 } else {109 var addition = new Addition();110 var node = addition.CreateTreeNode();111 var alphaConst = MakeConstant(alpha);112 node.AddSubtree(treeNode);113 node.AddSubtree(alphaConst);114 return node;115 }116 }117 118 private static ISymbolicExpressionTreeNode MakeProduct(ISymbolicExpressionTreeNode treeNode, double beta) {119 if (beta.IsAlmost(1.0)) {120 return treeNode;121 } else {122 var multipliciation = new Multiplication();123 var node = multipliciation.CreateTreeNode();124 var betaConst = MakeConstant(beta);125 node.AddSubtree(treeNode);126 node.AddSubtree(betaConst);127 return node;128 }129 }130 131 private static ISymbolicExpressionTreeNode MakeConstant(double c) {132 var node = (ConstantTreeNode)(new Constant()).CreateTreeNode();133 node.Value = c;134 return node;135 }136 #endregion137 64 } 138 65 }
Note: See TracChangeset
for help on using the changeset viewer.