Changeset 16951


Ignore:
Timestamp:
05/15/19 12:15:53 (12 days ago)
Author:
gkronber
Message:

#2925: added a separate result for the integrated error

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2925_AutoDiffForDynamicalModels/HeuristicLab.Problems.DynamicalSystemsModelling/3.3/Problem.cs

    r16893 r16951  
    604604        results.Add(new Result("SNMSE", typeof(DoubleValue)));
    605605      }
     606      if(!results.ContainsKey("SNMSE values")) {
     607        var dt = new DataTable("SNMSE values");
     608        dt.Rows.Add(new DataRow("ODE SNMSE"));
     609        dt.Rows.Add(new DataRow("Fitness"));
     610        results.Add(new Result("SNMSE values", dt));
     611      }
    606612      if (!results.ContainsKey("Solution")) {
    607613        results.Add(new Result("Solution", typeof(Solution)));
    608614      }
    609       if (!results.ContainsKey("Squared error and gradient")) {
    610         results.Add(new Result("Squared error and gradient", typeof(DataTable)));
    611       }
     615      // if (!results.ContainsKey("Squared error and gradient")) {
     616      //   results.Add(new Result("Squared error and gradient", typeof(DataTable)));
     617      // }
    612618
    613619      var bestIndividualAndQuality = this.GetBestIndividual(individuals, qualities);
     
    679685        // for target values and latent variables
    680686        var trainingRows = optimizationData.rows;
     687        double trainingSNMSE = 0.0;
    681688        for (int colIdx = 0; colIdx < trees.Length; colIdx++) {
    682689          // is target variable
    683690          if (colIdx < targetVars.Length) {
    684691            var targetVar = targetVars[colIdx];
    685             var trainingDataTable = new DataTable(targetVar + " prediction (training)");
     692            var trainingDataTable = new DataTable(targetVar + " prediction (training)"); 
    686693            var actualValuesRow = new DataRow(targetVar, "The values of " + targetVar, problemData.Dataset.GetDoubleValues(targetVar, trainingRows));
    687694            var idx = Enumerable.Range(0, trainingRows.Length).Select(i => i * targetVars.Length + colIdx);
     
    690697            trainingDataTable.Rows.Add(actualValuesRow);
    691698            trainingDataTable.Rows.Add(predictedValuesRow);
     699
     700            // again calculate the integrated error (regardless how fitness is determined)
     701            trainingSNMSE += actualValuesRow.Values.Zip(predictedValuesRow.Values, (a, p) => Math.Pow(a - p, 2)).Average() / actualValuesRow.Values.Variance() / targetVars.Length;
    692702
    693703            for (int paramIdx = 0; paramIdx < numParams; paramIdx++) {
     
    710720        }
    711721
    712         var errorTable = new DataTable("Squared error and gradient");
    713         var seRow = new DataRow("Squared error");
    714         var gradientRows = Enumerable.Range(0, numParams).Select(i => new DataRow($"∂SE/∂θ{i}")).ToArray();
    715         errorTable.Rows.Add(seRow);
    716         foreach (var gRow in gradientRows) {
    717           gRow.VisualProperties.SecondYAxis = true;
    718           errorTable.Rows.Add(gRow);
    719         }
    720         var targetValues = targetVars.Select(v => problemData.Dataset.GetDoubleValues(v, trainingRows).ToArray()).ToArray();
    721         int r = 0;
    722 
    723         // foreach (var y_pred in trainingPrediction) {
     722        results.AddOrUpdateResult("ODE SNMSE", new DoubleValue(trainingSNMSE));
     723        var odeSNMSETable = (DataTable)results["SNMSE values"].Value;
     724        odeSNMSETable.Rows["ODE SNMSE"].Values.Add(trainingSNMSE);
     725        odeSNMSETable.Rows["Fitness"].Values.Add(bestIndividualAndQuality.Item2);
     726
     727        // var errorTable = new DataTable("Squared error and gradient");
     728        // var seRow = new DataRow("Squared error");
     729        // var gradientRows = Enumerable.Range(0, numParams).Select(i => new DataRow($"∂SE/∂θ{i}")).ToArray();
     730        // errorTable.Rows.Add(seRow);
     731        // foreach (var gRow in gradientRows) {
     732        //   gRow.VisualProperties.SecondYAxis = true;
     733        //   errorTable.Rows.Add(gRow);
     734        // }
     735        // var targetValues = targetVars.Select(v => problemData.Dataset.GetDoubleValues(v, trainingRows).ToArray()).ToArray();
     736        // int r = 0;
     737
     738        // foreach (var y_pred in fi) {
    724739        //   // calculate objective function gradient
    725740        //   double f_i = 0.0;
     
    15991614    #region  helper
    16001615
    1601     private static IEnumerable<T> EveryNth<T>(IEnumerable<T> xs, int step) {
    1602       var e = xs.GetEnumerator();
    1603       while (e.MoveNext()) {
    1604         for (int i = 0; i < step; i++) {
    1605           if (!e.MoveNext()) yield break;
    1606         }
    1607         yield return e.Current;
    1608       }
    1609     }
    16101616
    16111617    private void InitAllParameters() {
     
    16301636
    16311637    private static bool IsConstantNode(ISymbolicExpressionTreeNode n) {
    1632       // return n.Symbol.Name[0] == 'θ';
    16331638      return n is ConstantTreeNode;
    16341639    }
     
    17361741
    17371742      grammar.ConfigureAsDefaultRegressionGrammar();
    1738       grammar.GetSymbol("Logarithm").Enabled = false; // not supported yet
    1739       grammar.GetSymbol("Exponential").Enabled = false; // not supported yet
    17401743
    17411744      // configure initialization of constants
Note: See TracChangeset for help on using the changeset viewer.