Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/17/11 15:14:45 (13 years ago)
Author:
gkronber
Message:

#1418 implemented linear scaling for classification solutions, fixed bugs interactive simplifier view for classification solutions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification/3.4/SymbolicDiscriminantFunctionClassificationSolution.cs

    r5717 r5736  
    3939  [Item(Name = "SymbolicDiscriminantFunctionClassificationSolution", Description = "Represents a symbolic classification solution (model + data) and attributes of the solution like accuracy and complexity.")]
    4040  public sealed class SymbolicDiscriminantFunctionClassificationSolution : DiscriminantFunctionClassificationSolution, ISymbolicClassificationSolution {
     41    private const string ModelLengthResultName = "ModelLength";
     42    private const string ModelDepthResultName = "ModelDepth";
    4143
    4244    public new ISymbolicDiscriminantFunctionClassificationModel Model {
     
    5254      get { return Model; }
    5355    }
     56    public int ModelLength {
     57      get { return ((IntValue)this[ModelLengthResultName].Value).Value; }
     58      private set { ((IntValue)this[ModelLengthResultName].Value).Value = value; }
     59    }
    5460
     61    public int ModelDepth {
     62      get { return ((IntValue)this[ModelDepthResultName].Value).Value; }
     63      private set { ((IntValue)this[ModelDepthResultName].Value).Value = value; }
     64    }
    5565    [StorableConstructor]
    5666    private SymbolicDiscriminantFunctionClassificationSolution(bool deserializing) : base(deserializing) { }
     
    6070    public SymbolicDiscriminantFunctionClassificationSolution(ISymbolicDiscriminantFunctionClassificationModel model, IClassificationProblemData problemData)
    6171      : 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();
    6275    }
    6376
     
    6578      return new SymbolicDiscriminantFunctionClassificationSolution(this, cloner);
    6679    }
     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    }
    67159  }
    68160}
Note: See TracChangeset for help on using the changeset viewer.