Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/14/12 17:10:08 (12 years ago)
Author:
gkronber
Message:

#1902 fixed test cases, improved performance

Location:
trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess
Files:
5 edited

Legend:

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

    r8484 r8491  
    3434    public double Scale { get { return sf2; } }
    3535    [Storable]
    36     private double l;
    37     public double Length { get { return l; } }
     36    private double inverseLength;
     37    public double InverseLength { get { return inverseLength; } }
    3838    [Storable]
    3939    private double p;
     
    4848      : base(original, cloner) {
    4949      sf2 = original.sf2;
    50       l = original.l;
     50      inverseLength = original.inverseLength;
    5151      p = original.p;
    5252    }
     
    6161    public void SetParameter(double[] hyp) {
    6262      if (hyp.Length != 3) throw new ArgumentException();
    63       this.l = Math.Exp(hyp[0]);
     63      this.inverseLength = 1.0 / Math.Exp(hyp[0]);
    6464      this.p = Math.Exp(hyp[1]);
    6565      this.sf2 = Math.Exp(2 * hyp[2]);
     
    6969      double k = i == j ? 0.0 : GetDistance(x, x, i, j);
    7070      k = Math.PI * k / p;
    71       k = Math.Sin(k) / l;
     71      k = Math.Sin(k) * inverseLength;
    7272      k = k * k;
    7373
     
    7777    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
    7878      double v = i == j ? 0.0 : Math.PI * GetDistance(x, x, i, j) / p;
    79       double gradient = Math.Sin(v) / l;
     79      double gradient = Math.Sin(v) * inverseLength;
    8080      gradient *= gradient;
    8181      yield return 4.0 * sf2 * Math.Exp(-2.0 * gradient) * gradient;
    82       double r = Math.Sin(v) / l;
    83       yield return 4.0 * sf2 / l * Math.Exp(-2 * r * r) * r * Math.Cos(v) * v;
     82      double r = Math.Sin(v) * inverseLength;
     83      yield return 4.0 * sf2 * inverseLength * Math.Exp(-2 * r * r) * r * Math.Cos(v) * v;
    8484      yield return 2.0 * sf2 * Math.Exp(-2 * gradient);
    8585    }
     
    8888      double k = GetDistance(x, xt, i, j);
    8989      k = Math.PI * k / p;
    90       k = Math.Sin(k) / l;
     90      k = Math.Sin(k) * inverseLength;
    9191      k = k * k;
    9292
     
    9595
    9696    private double GetDistance(double[,] x, double[,] xt, int i, int j) {
    97       return Math.Sqrt(Util.SqrDist(Util.GetRow(x, i), Util.GetRow(xt, j)));
     97      return Math.Sqrt(Util.SqrDist(x, i, xt, j));
    9898    }
    9999  }
  • trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceRQiso.cs

    r8484 r8491  
    2222using System;
    2323using System.Collections.Generic;
    24 using System.Linq;
    2524using HeuristicLab.Common;
    2625using HeuristicLab.Core;
     
    3635    public double Scale { get { return sf2; } }
    3736    [Storable]
    38     private double l;
    39     public double Length { get { return l; } }
     37    private double inverseLength;
     38    public double InverseLength { get { return inverseLength; } }
    4039    [Storable]
    4140    private double alpha;
     
    5049      : base(original, cloner) {
    5150      this.sf2 = original.sf2;
    52       this.l = original.l;
     51      this.inverseLength = original.inverseLength;
    5352      this.alpha = original.alpha;
    5453    }
     
    6867    public void SetParameter(double[] hyp) {
    6968      if (hyp.Length != 3) throw new ArgumentException("CovarianceRQiso has three hyperparameters", "k");
    70       this.l = Math.Exp(hyp[0]);
     69      this.inverseLength = 1.0 / Math.Exp(hyp[0]);
    7170      this.sf2 = Math.Exp(2 * hyp[1]);
    7271      this.alpha = Math.Exp(hyp[2]);
     
    7574
    7675    public double GetCovariance(double[,] x, int i, int j) {
    77       double lInv = 1.0 / l;
    7876      double d = i == j
    7977                   ? 0.0
    80                    : Util.SqrDist(Util.GetRow(x, i).Select(e => e * lInv), Util.GetRow(x, j).Select(e => e * lInv));
     78                   : Util.SqrDist(x, i, j, inverseLength);
    8179      return sf2 * Math.Pow(1 + 0.5 * d / alpha, -alpha);
    8280    }
    8381
    8482    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
    85       double lInv = 1.0 / l;
    8683      double d = i == j
    8784                   ? 0.0
    88                    : Util.SqrDist(Util.GetRow(x, i).Select(e => e * lInv), Util.GetRow(x, j).Select(e => e * lInv));
     85                   : Util.SqrDist(x, i, j, inverseLength);
    8986
    9087      double b = 1 + 0.5 * d / alpha;
     
    9592
    9693    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
    97       double lInv = 1.0 / l;
    98       double d = Util.SqrDist(Util.GetRow(x, i).Select(e => e * lInv), Util.GetRow(xt, j).Select(e => e * lInv));
     94      double d = Util.SqrDist(x, i, xt, j, inverseLength);
    9995      return sf2 * Math.Pow(1 + 0.5 * d / alpha, -alpha);
    10096    }
  • trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEard.cs

    r8489 r8491  
    3636
    3737    [Storable]
    38     private double[] l;
     38    private double[] inverseLength;
    3939    public double[] Length {
    4040      get {
    41         if (l == null) return new double[0];
    42         var copy = new double[l.Length];
    43         Array.Copy(l, copy, copy.Length);
     41        if (inverseLength == null) return new double[0];
     42        var copy = new double[inverseLength.Length];
     43        Array.Copy(inverseLength, copy, copy.Length);
    4444        return copy;
    4545      }
     
    5353    protected CovarianceSEard(CovarianceSEard original, Cloner cloner)
    5454      : base(original, cloner) {
    55       if (original.l != null) {
    56         this.l = new double[original.l.Length];
    57         Array.Copy(original.l, this.l, l.Length);
     55      if (original.inverseLength != null) {
     56        this.inverseLength = new double[original.inverseLength.Length];
     57        Array.Copy(original.inverseLength, this.inverseLength, inverseLength.Length);
    5858      }
    5959      this.sf2 = original.sf2;
     
    6868
    6969    public void SetParameter(double[] hyp) {
    70       this.l = hyp.Take(hyp.Length - 1).Select(Math.Exp).ToArray();
     70      this.inverseLength = hyp.Take(hyp.Length - 1).Select(p => 1.0 / Math.Exp(p)).ToArray();
    7171      this.sf2 = Math.Exp(2 * hyp[hyp.Length - 1]);
    7272    }
     
    7575      double d = i == j
    7676                   ? 0.0
    77                    : Util.SqrDist(Util.GetRow(x, i).Select((e, k) => e / l[k]),
    78                                   Util.GetRow(x, j).Select((e, k) => e / l[k]));
     77                   : Util.SqrDist(x, i, j, inverseLength);
    7978      return sf2 * Math.Exp(-d / 2.0);
    8079    }
     
    8382      double d = i == j
    8483                   ? 0.0
    85                    : Util.SqrDist(Util.GetRow(x, i).Select((e, ii) => e / l[ii]),
    86                                   Util.GetRow(x, j).Select((e, ii) => e / l[ii]));
     84                   : Util.SqrDist(x, i, j, inverseLength);
    8785
    88       for (int ii = 0; ii < l.Length; ii++) {
    89         double sqrDist = Util.SqrDist(x[i, ii] / l[ii], x[j, ii] / l[ii]);
     86      for (int ii = 0; ii < inverseLength.Length; ii++) {
     87        double sqrDist = Util.SqrDist(x[i, ii] * inverseLength[ii], x[j, ii] * inverseLength[ii]);
    9088        yield return sf2 * Math.Exp(-d / 2.0) * sqrDist;
    9189      }
     
    9492
    9593    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
    96       double d = Util.SqrDist(Util.GetRow(x, i).Select((e, k) => e / l[k]), Util.GetRow(xt, j).Select((e, k) => e / l[k]));
     94      double d = Util.SqrDist(x, i, xt, j, inverseLength);
    9795      return sf2 * Math.Exp(-d / 2.0);
    9896    }
  • trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceSEiso.cs

    r8484 r8491  
    2222using System;
    2323using System.Collections.Generic;
    24 using System.Linq;
    2524using HeuristicLab.Common;
    2625using HeuristicLab.Core;
     
    3635    public double Scale { get { return sf2; } }
    3736    [Storable]
    38     private double l;
    39     public double Length { get { return l; } }
     37    private double inverseLength;
     38    public double InverseLength { get { return inverseLength; } }
    4039
    4140    [StorableConstructor]
     
    4746      : base(original, cloner) {
    4847      this.sf2 = original.sf2;
    49       this.l = original.l;
     48      this.inverseLength = original.inverseLength;
    5049    }
    5150
     
    6463    public void SetParameter(double[] hyp) {
    6564      if (hyp.Length != 2) throw new ArgumentException("CovarianceSEiso has two hyperparameters", "k");
    66       this.l = Math.Exp(hyp[0]);
     65      this.inverseLength = 1.0 / Math.Exp(hyp[0]);
    6766      this.sf2 = Math.Exp(2 * hyp[1]);
    6867    }
     
    7069
    7170    public double GetCovariance(double[,] x, int i, int j) {
    72       double lInv = 1.0 / l;
    7371      double d = i == j
    7472                   ? 0.0
    75                    : Util.SqrDist(Util.GetRow(x, i).Select(e => e * lInv), Util.GetRow(x, j).Select(e => e * lInv));
     73                   : Util.SqrDist(x, i, j, inverseLength);
    7674      return sf2 * Math.Exp(-d / 2.0);
    7775    }
    7876
    7977    public IEnumerable<double> GetGradient(double[,] x, int i, int j) {
    80       double lInv = 1.0 / l;
    8178      double d = i == j
    8279                   ? 0.0
    83                    : Util.SqrDist(Util.GetRow(x, i).Select(e => e * lInv), Util.GetRow(x, j).Select(e => e * lInv));
     80                   : Util.SqrDist(x, i, j, inverseLength);
    8481      double g = Math.Exp(-d / 2.0);
    8582      yield return sf2 * g * d;
     
    8885
    8986    public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j) {
    90       double lInv = 1.0 / l;
    91       double d = Util.SqrDist(Util.GetRow(x, i).Select(e => e * lInv), Util.GetRow(xt, j).Select(e => e * lInv));
     87      double d = Util.SqrDist(x, i, xt, j, inverseLength);
    9288      return sf2 * Math.Exp(-d / 2.0);
    9389    }
  • trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Util.cs

    r8463 r8491  
    3838    }
    3939
     40    public static double SqrDist(double[,] x, int i, int j, double scale = 1.0) {
     41      return SqrDist(x, i, x, j, scale);
     42    }
     43
     44    public static double SqrDist(double[,] x, int i, double[,] xt, int j, double scale = 1.0) {
     45      double ss = 0.0;
     46      for (int k = 0; k < x.GetLength(1); k++) {
     47        double d = x[i, k] - xt[j, k];
     48        ss += d * d;
     49      }
     50      return scale * scale * ss;
     51    }
     52    public static double SqrDist(double[,] x, int i, int j, double[] scale) {
     53      return SqrDist(x, i, x, j, scale);
     54    }
     55
     56    public static double SqrDist(double[,] x, int i, double[,] xt, int j, double[] scale) {
     57      double ss = 0.0;
     58      for (int k = 0; k < x.GetLength(1); k++) {
     59        double d = x[i, k] - xt[j, k];
     60        ss += d * d * scale[k] * scale[k];
     61      }
     62      return ss;
     63    }
     64
    4065    public static IEnumerable<double> GetRow(double[,] x, int r) {
    4166      int cols = x.GetLength(1);
Note: See TracChangeset for help on using the changeset viewer.