Changeset 9363 for branches/OaaS/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView.cs
- Timestamp:
- 04/16/13 13:13:41 (12 years ago)
- Location:
- branches/OaaS
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/OaaS
- Property svn:ignore
-
old new 21 21 protoc.exe 22 22 _ReSharper.HeuristicLab 3.3 Tests 23 Google.ProtocolBuffers-2.4.1.473.dll 23 24 packages
-
- Property svn:mergeinfo changed
- Property svn:ignore
-
branches/OaaS/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views merged eligible /branches/Algorithms.GradientDescent/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5516-5520 /branches/Benchmarking/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 6917-7005 /branches/CloningRefactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 4656-4721 /branches/DataAnalysis Refactoring/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5471-5808 /branches/DataAnalysis SolutionEnsembles/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5815-6180 /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 4458-4459,4462,4464 /branches/GP.Grammar.Editor/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 6284-6795 /branches/GP.Symbols (TimeLag, Diff, Integral)/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5060 /branches/HeuristicLab.TreeSimplifier/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 8916-8942 /branches/NET40/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5138-5162 /branches/ParallelEngine/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5175-5192 /branches/ProblemInstancesRegressionAndClassification/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 7568-7810 /branches/QAPAlgorithms/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 6350-6627 /branches/Restructure trunk solution/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 6828 /branches/RuntimeOptimizer/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 8943-9078 /branches/ScatterSearch (trunk integration)/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 7787-8333 /branches/SlaveShutdown/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 8944-8956 /branches/SuccessProgressAnalysis/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5370-5682 /branches/Trunk/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 6829-6865 /branches/UnloadJobs/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 9168-9215 /branches/VNS/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5594-5752 /branches/histogram/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views 5959-6341
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
branches/OaaS/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4
- Property svn:ignore
-
old new 5 5 *.vs10x 6 6 Plugin.cs 7 *.user
-
- Property svn:ignore
-
branches/OaaS/HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views/3.4/InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView.cs
r8139 r9363 20 20 #endregion 21 21 22 using System;23 using System.Collections.Generic;24 using System.Linq;25 using HeuristicLab.Common;26 22 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 27 using HeuristicLab.Problems.DataAnalysis.Symbolic.Views;28 23 29 24 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Classification.Views { 30 public partial class InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView : InteractiveSymbolicDataAnalysisSolutionSimplifierView { 31 private readonly ConstantTreeNode constantNode; 32 private readonly SymbolicExpressionTree tempTree; 33 25 public partial class InteractiveSymbolicDiscriminantFunctionClassificationSolutionSimplifierView : InteractiveSymbolicClassificationSolutionSimplifierViewBase { 34 26 public new SymbolicDiscriminantFunctionClassificationSolution Content { 35 27 get { return (SymbolicDiscriminantFunctionClassificationSolution)base.Content; } … … 41 33 InitializeComponent(); 42 34 this.Caption = "Interactive Classification Solution Simplifier"; 43 44 constantNode = ((ConstantTreeNode)new Constant().CreateTreeNode());45 ISymbolicExpressionTreeNode root = new ProgramRootSymbol().CreateTreeNode();46 ISymbolicExpressionTreeNode start = new StartSymbol().CreateTreeNode();47 root.AddSubtree(start);48 tempTree = new SymbolicExpressionTree(root);49 35 } 50 36 51 37 protected override void UpdateModel(ISymbolicExpressionTree tree) { 52 Content.Model = new SymbolicDiscriminantFunctionClassificationModel(tree, Content.Model.Interpreter); 53 // the default policy for setting thresholds in classification models is the accuarcy maximizing policy. 54 // This is rather slow to calculate and can lead to a very laggy UI in the interactive solution simplifier. 55 // However, since we automatically prune sub-trees based on the threshold reaching the maximum accuracy we must 56 // also use maximum accuracy threshold calculation here in order to prevent incoherent behavior of the simplifier. 57 Content.SetAccuracyMaximizingThresholds(); 58 } 59 60 protected override Dictionary<ISymbolicExpressionTreeNode, double> CalculateReplacementValues(ISymbolicExpressionTree tree) { 61 Dictionary<ISymbolicExpressionTreeNode, double> replacementValues = new Dictionary<ISymbolicExpressionTreeNode, double>(); 62 foreach (ISymbolicExpressionTreeNode node in tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPrefix()) { 63 replacementValues[node] = CalculateReplacementValue(node, tree); 64 } 65 return replacementValues; 66 } 67 68 protected override Dictionary<ISymbolicExpressionTreeNode, double> CalculateImpactValues(ISymbolicExpressionTree tree) { 69 var interpreter = Content.Model.Interpreter; 70 var dataset = Content.ProblemData.Dataset; 71 var rows = Content.ProblemData.TrainingIndices; 72 string targetVariable = Content.ProblemData.TargetVariable; 73 Dictionary<ISymbolicExpressionTreeNode, double> impactValues = new Dictionary<ISymbolicExpressionTreeNode, double>(); 74 List<ISymbolicExpressionTreeNode> nodes = tree.Root.GetSubtree(0).GetSubtree(0).IterateNodesPostfix().ToList(); 75 76 var targetClassValues = dataset.GetDoubleValues(targetVariable, rows); 77 var originalOutput = interpreter.GetSymbolicExpressionTreeValues(tree, dataset, rows) 78 .LimitToRange(Content.Model.LowerEstimationLimit, Content.Model.UpperEstimationLimit) 79 .ToArray(); 80 OnlineCalculatorError errorState; 81 double originalGini = NormalizedGiniCalculator.Calculate(targetClassValues, originalOutput, out errorState); 82 if (errorState != OnlineCalculatorError.None) originalGini = 0.0; 83 84 foreach (ISymbolicExpressionTreeNode node in nodes) { 85 var parent = node.Parent; 86 constantNode.Value = CalculateReplacementValue(node, tree); 87 ISymbolicExpressionTreeNode replacementNode = constantNode; 88 SwitchNode(parent, node, replacementNode); 89 var newOutput = interpreter.GetSymbolicExpressionTreeValues(tree, dataset, rows) 90 .LimitToRange(Content.Model.LowerEstimationLimit, Content.Model.UpperEstimationLimit) 91 .ToArray(); 92 double newGini = NormalizedGiniCalculator.Calculate(targetClassValues, newOutput, out errorState); 93 if (errorState != OnlineCalculatorError.None) newGini = 0.0; 94 95 // impact = 0 if no change 96 // impact < 0 if new solution is better 97 // impact > 0 if new solution is worse 98 impactValues[node] = originalGini - newGini; 99 SwitchNode(parent, replacementNode, node); 100 } 101 return impactValues; 102 } 103 104 private double CalculateReplacementValue(ISymbolicExpressionTreeNode node, ISymbolicExpressionTree sourceTree) { 105 // remove old ADFs 106 while (tempTree.Root.SubtreeCount > 1) tempTree.Root.RemoveSubtree(1); 107 // clone ADFs of source tree 108 for (int i = 1; i < sourceTree.Root.SubtreeCount; i++) { 109 tempTree.Root.AddSubtree((ISymbolicExpressionTreeNode)sourceTree.Root.GetSubtree(i).Clone()); 110 } 111 var start = tempTree.Root.GetSubtree(0); 112 while (start.SubtreeCount > 0) start.RemoveSubtree(0); 113 start.AddSubtree((ISymbolicExpressionTreeNode)node.Clone()); 114 var interpreter = Content.Model.Interpreter; 115 var rows = Content.ProblemData.TrainingIndices; 116 return interpreter.GetSymbolicExpressionTreeValues(tempTree, Content.ProblemData.Dataset, rows).Median(); 117 } 118 119 120 private void SwitchNode(ISymbolicExpressionTreeNode root, ISymbolicExpressionTreeNode oldBranch, ISymbolicExpressionTreeNode newBranch) { 121 for (int i = 0; i < root.SubtreeCount; i++) { 122 if (root.GetSubtree(i) == oldBranch) { 123 root.RemoveSubtree(i); 124 root.InsertSubtree(i, newBranch); 125 return; 126 } 127 } 128 } 129 130 protected override void btnOptimizeConstants_Click(object sender, EventArgs e) { 131 38 var model = CreateModel(tree); 39 Content.Model = (ISymbolicDiscriminantFunctionClassificationModel)model; 132 40 } 133 41 }
Note: See TracChangeset
for help on using the changeset viewer.