Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/21/11 19:08:06 (12 years ago)
Author:
gkronber
Message:

#1621: fixed bugs in response function view and added scatter plot of original data as a reference.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views/3.4/SymbolicDataAnalysisSolutionResponseFunctionView.cs

    r7020 r7028  
    3030using HeuristicLab.MainForm.WindowsForms;
    3131
    32 namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Views {
     32namespace HeuristicLab.Problems.DataAnalysis.Symbolic.Regression.Views {
    3333  [View("Response Function View")]
    34   [Content(typeof(RegressionSolutionBase), false)]
     34  [Content(typeof(ISymbolicRegressionSolution), false)]
    3535  public partial class SymbolicDataAnalysisSolutionResponseFunctionView : AsynchronousContentView {
    3636    private Dictionary<string, List<ISymbolicExpressionTreeNode>> variableNodes;
     
    4444    }
    4545
    46     public new ISymbolicDataAnalysisSolution Content {
    47       get { return (ISymbolicDataAnalysisSolution)base.Content; }
     46    public new ISymbolicRegressionSolution Content {
     47      get { return (ISymbolicRegressionSolution)base.Content; }
    4848      set { base.Content = value; }
    4949    }
     
    122122        constNode.Value = value;
    123123
    124       UpdateChart();
    125     }
    126 
    127     private void UpdateChart() {
     124      UpdateResponseSeries();
     125    }
     126
     127    private void UpdateScatterPlot() {
    128128      string freeVariable = (string)comboBox.SelectedItem;
    129129      IEnumerable<string> fixedVariables = comboBox.Items.OfType<string>()
    130130        .Except(new string[] { freeVariable });
     131     
     132      // scatter plots for subset of samples that have values near the median values for all variables
     133      Func<int, bool> NearMedianValue = (r) => {
     134        foreach (var fixedVar in fixedVariables) {
     135          double med = medianValues[fixedVar];
     136          if (!(Content.ProblemData.Dataset.GetDoubleValue(fixedVar, r) < med + 0.1 * Math.Abs(med) &&
     137            Content.ProblemData.Dataset.GetDoubleValue(fixedVar, r) > med - 0.1 * Math.Abs(med)))
     138            return false;
     139        }
     140        return true;
     141      };
     142
     143      var mainTrainingIndizes = (from row in Content.ProblemData.TrainingIndizes
     144                                 where NearMedianValue(row)
     145                                 select row)
     146        .ToArray();
     147      var mainTestIndizes = (from row in Content.ProblemData.TestIndizes
     148                             where NearMedianValue(row)
     149                             select row)
     150        .ToArray();
     151
     152      var freeVariableValues = Content.ProblemData.Dataset.GetDoubleValues(freeVariable, mainTrainingIndizes).ToArray();
     153      var trainingValues = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable,
     154                                                                     mainTrainingIndizes).ToArray();
     155      Array.Sort(freeVariableValues, trainingValues);
     156      responseChart.Series["Training Data"].Points.DataBindXY(freeVariableValues, trainingValues);
     157
     158      freeVariableValues = Content.ProblemData.Dataset.GetDoubleValues(freeVariable, mainTestIndizes).ToArray();
     159      var testValues = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable,
     160                                                                     mainTestIndizes).ToArray();
     161      Array.Sort(freeVariableValues, testValues);
     162      responseChart.Series["Test Data"].Points.DataBindXY(freeVariableValues, testValues);
     163
     164      // draw scatter plots of remaining values
     165      freeVariableValues = Content.ProblemData.Dataset.GetDoubleValues(freeVariable, Content.ProblemData.TrainingIndizes).ToArray();
     166      trainingValues = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable,
     167                                                                     Content.ProblemData.TrainingIndizes).ToArray();
     168      Array.Sort(freeVariableValues, trainingValues);
     169      responseChart.Series["Training Data (edge)"].Points.DataBindXY(freeVariableValues, trainingValues);
     170
     171      freeVariableValues = Content.ProblemData.Dataset.GetDoubleValues(freeVariable, Content.ProblemData.TestIndizes).ToArray();
     172      testValues = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable,
     173                                                                     Content.ProblemData.TestIndizes).ToArray();
     174      Array.Sort(freeVariableValues, testValues);
     175      responseChart.Series["Test Data (edge)"].Points.DataBindXY(freeVariableValues, testValues);
     176
     177
     178
     179      responseChart.ChartAreas[0].AxisX.Maximum = Math.Ceiling(freeVariableValues.Max());
     180      responseChart.ChartAreas[0].AxisX.Minimum = Math.Floor(freeVariableValues.Min());
     181      responseChart.ChartAreas[0].AxisY.Maximum = Math.Ceiling(Math.Max(testValues.Max(), trainingValues.Max()));
     182      responseChart.ChartAreas[0].AxisY.Minimum = Math.Floor(Math.Min(testValues.Min(), trainingValues.Min()));
     183    }
     184
     185    private void UpdateResponseSeries() {
     186      string freeVariable = (string)comboBox.SelectedItem;
    131187
    132188      var freeVariableValues = Content.ProblemData.Dataset.GetDoubleValues(freeVariable, Content.ProblemData.TrainingIndizes).ToArray();
    133189      var responseValues = Content.Model.Interpreter.GetSymbolicExpressionTreeValues(clonedTree,
    134190                                                                              Content.ProblemData.Dataset,
    135                                                                               Content.ProblemData.TrainingIndizes).ToArray();
     191                                                                              Content.ProblemData.TrainingIndizes)
     192                                                                              .ToArray();
    136193      Array.Sort(freeVariableValues, responseValues);
    137194      responseChart.Series["Model Response"].Points.DataBindXY(freeVariableValues, responseValues);
     195    }
     196
     197    private void ComboBoxSelectedIndexChanged(object sender, EventArgs e) {
     198      string freeVariable = (string)comboBox.SelectedItem;
     199      IEnumerable<string> fixedVariables = comboBox.Items.OfType<string>()
     200        .Except(new string[] { freeVariable });
     201
     202      variableNodes.Clear();
     203      clonedTree = (ISymbolicExpressionTree)Content.Model.SymbolicExpressionTree.Clone();
     204
     205      foreach (var varNode in clonedTree.IterateNodesPrefix().OfType<VariableTreeNode>()) {
     206        if (fixedVariables.Contains(varNode.VariableName)) {
     207          if (!variableNodes.ContainsKey(varNode.VariableName))
     208            variableNodes.Add(varNode.VariableName, new List<ISymbolicExpressionTreeNode>());
     209
     210          int childIndex = varNode.Parent.IndexOfSubtree(varNode);
     211          var replacementNode = MakeConstantTreeNode(medianValues[varNode.VariableName]);
     212          var parent = varNode.Parent;
     213          parent.RemoveSubtree(childIndex);
     214          parent.InsertSubtree(childIndex, MakeProduct(replacementNode, varNode.Weight));
     215          variableNodes[varNode.VariableName].Add(replacementNode);
     216        }
     217      }
     218
     219      CreateSliders(fixedVariables);
     220      UpdateScatterPlot();
     221      UpdateResponseSeries();
     222    }
     223
     224    private ISymbolicExpressionTreeNode MakeProduct(ConstantTreeNode c, double weight) {
     225      var mul = new Multiplication();
     226      var prod = mul.CreateTreeNode();
     227      prod.AddSubtree(MakeConstantTreeNode(weight));
     228      prod.AddSubtree(c);
     229      return prod;
    138230    }
    139231
     
    146238      return constantTreeNode;
    147239    }
    148 
    149     private void ComboBoxSelectedIndexChanged(object sender, EventArgs e) {
    150       string freeVariable = (string)comboBox.SelectedItem;
    151       IEnumerable<string> fixedVariables = comboBox.Items.OfType<string>()
    152         .Except(new string[] { freeVariable });
    153 
    154       variableNodes.Clear();
    155       clonedTree = (ISymbolicExpressionTree)Content.Model.SymbolicExpressionTree.Clone();
    156 
    157       foreach (var varNode in clonedTree.IterateNodesPrefix().OfType<VariableTreeNode>()) {
    158         if (fixedVariables.Contains(varNode.VariableName)) {
    159           if (!variableNodes.ContainsKey(varNode.VariableName))
    160             variableNodes.Add(varNode.VariableName, new List<ISymbolicExpressionTreeNode>());
    161 
    162           int childIndex = varNode.Parent.IndexOfSubtree(varNode);
    163           var replacementNode = MakeConstantTreeNode(medianValues[varNode.VariableName]);
    164           var parent = varNode.Parent;
    165           parent.RemoveSubtree(childIndex);
    166           parent.InsertSubtree(childIndex, replacementNode);
    167           variableNodes[varNode.VariableName].Add(replacementNode);
    168         }
    169       }
    170 
    171       CreateSliders(fixedVariables);
    172       UpdateChart();
    173     }
    174240  }
    175241}
Note: See TracChangeset for help on using the changeset viewer.