Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/09/12 16:32:44 (12 years ago)
Author:
gkronber
Message:

#1902 improved GPR implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs

    r8455 r8463  
    7373    private double[,] x;
    7474    [Storable]
    75     private Scaling scaling;
     75    private Scaling inputScaling;
     76    [Storable]
     77    private Scaling targetScaling;
    7678
    7779
     
    8284      this.meanFunction = cloner.Clone(original.meanFunction);
    8385      this.covarianceFunction = cloner.Clone(original.covarianceFunction);
    84       this.scaling = cloner.Clone(original.scaling);
     86      this.inputScaling = cloner.Clone(original.inputScaling);
     87      this.targetScaling = cloner.Clone(original.targetScaling);
    8588      this.negativeLogLikelihood = original.negativeLogLikelihood;
    8689      this.targetVariable = original.targetVariable;
     
    118121
    119122    private void CalculateModel(Dataset ds, IEnumerable<int> rows) {
    120       scaling = new Scaling(ds, allowedInputVariables, rows);
    121       x = AlglibUtil.PrepareAndScaleInputMatrix(ds, allowedInputVariables, rows, scaling);
    122 
    123       var y = ds.GetDoubleValues(targetVariable, rows).ToArray();
     123      inputScaling = new Scaling(ds, allowedInputVariables, rows);
     124      x = AlglibUtil.PrepareAndScaleInputMatrix(ds, allowedInputVariables, rows, inputScaling);
     125
     126
     127      targetScaling = new Scaling(ds, new string[] { targetVariable }, rows);
     128      var y = targetScaling.GetScaledValues(ds, targetVariable, rows);
    124129
    125130      int n = x.GetLength(0);
     
    162167      int n = x.GetLength(0);
    163168      int nAllowedVariables = x.GetLength(1);
    164       double[,] q = new double[n, n];
    165       double[,] eye = new double[n, n];
    166       for (int i = 0; i < n; i++) eye[i, i] = 1.0;
    167169
    168170      int info;
    169       alglib.densesolverreport denseSolveRep;
    170 
    171       alglib.spdmatrixcholeskysolvem(l, n, false, eye, n, out info, out denseSolveRep, out q);
    172       // double[,] a2 = outerProd(alpha, alpha);
     171      alglib.matinvreport matInvRep;
     172
     173      alglib.spdmatrixcholeskyinverse(ref l, n, false, out info, out matInvRep);
     174      if (info != 1) throw new ArgumentException("Can't invert matrix to calculate gradients.");
    173175      for (int i = 0; i < n; i++) {
    174         for (int j = 0; j < n; j++)
    175           q[i, j] = q[i, j] / sqrSigmaNoise - alpha[i] * alpha[j]; // a2[i, j];
    176       }
    177 
    178       double noiseGradient = sqrSigmaNoise * Enumerable.Range(0, n).Select(i => q[i, i]).Sum();
     176        for (int j = 0; j <= i; j++)
     177          l[i, j] = l[i, j] / sqrSigmaNoise - alpha[i] * alpha[j];
     178      }
     179
     180      double noiseGradient = sqrSigmaNoise * Enumerable.Range(0, n).Select(i => l[i, i]).Sum();
    179181
    180182      double[] meanGradients = new double[meanFunction.GetNumberOfParameters(nAllowedVariables)];
     
    187189      if (covGradients.Length > 0) {
    188190        for (int i = 0; i < n; i++) {
    189           for (int j = 0; j < n; j++) {
    190             for (int k = 0; k < covGradients.Length; k++) {
    191               covGradients[k] += q[i, j] * covarianceFunction.GetGradient(i, j, k);
     191          for (int k = 0; k < covGradients.Length; k++) {
     192            for (int j = 0; j < i; j++) {
     193              covGradients[k] += l[i, j] * covarianceFunction.GetGradient(i, j, k);
    192194            }
     195            covGradients[k] += 0.5 * l[i, i] * covarianceFunction.GetGradient(i, i, k);
    193196          }
    194197        }
    195         covGradients = covGradients.Select(g => g / 2.0).ToArray();
    196198      }
    197199
     
    219221
    220222    private IEnumerable<double> GetEstimatedValuesHelper(Dataset dataset, IEnumerable<int> rows) {
    221       var newX = AlglibUtil.PrepareAndScaleInputMatrix(dataset, allowedInputVariables, rows, scaling);
     223      var newX = AlglibUtil.PrepareAndScaleInputMatrix(dataset, allowedInputVariables, rows, inputScaling);
    222224      int newN = newX.GetLength(0);
    223225      int n = x.GetLength(0);
     
    251253      // alglib.rmatrixsolvem(l, n, sWKs, newN, true, out info, out denseSolveRep, out v);
    252254
    253 
    254       for (int i = 0; i < newN; i++) {
    255         // predMean[i] = ms[i] + prod(GetRow(Ks, i), alpha);
    256         yield return ms[i] + Util.ScalarProd(Util.GetRow(Ks, i), alpha);
    257         // var sumV2 = prod(GetCol(v, i), GetCol(v, i));
    258         // predVar[i] = kss[i] - sumV2;
    259       }
     255      double targetScaleMin, targetScaleMax;
     256      targetScaling.GetScalingParameters(targetVariable, out targetScaleMin, out targetScaleMax);
     257      return Enumerable.Range(0, newN)
     258        .Select(i => ms[i] + Util.ScalarProd(Util.GetRow(Ks, i), alpha))
     259        .Select(m => m * (targetScaleMax - targetScaleMin) + targetScaleMin);
     260      //for (int i = 0; i < newN; i++) {
     261      //  // predMean[i] = ms[i] + prod(GetRow(Ks, i), alpha);
     262      //  // var sumV2 = prod(GetCol(v, i), GetCol(v, i));
     263      //  // predVar[i] = kss[i] - sumV2;
     264      //}
    260265
    261266    }
Note: See TracChangeset for help on using the changeset viewer.