Changeset 8982 for trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunctions/CovarianceMaternIso.cs
- Timestamp:
- 12/01/12 19:02:47 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/CovarianceFunctions/CovarianceMaternIso.cs
r8929 r8982 34 34 Description = "Matern covariance function for Gaussian processes.")] 35 35 public sealed class CovarianceMaternIso : ParameterizedNamedItem, ICovarianceFunction { 36 [Storable]37 private double inverseLength;38 [Storable]39 private readonly HyperParameter<DoubleValue> inverseLengthParameter;40 36 public IValueParameter<DoubleValue> InverseLengthParameter { 41 get { return inverseLengthParameter; }37 get { return (IValueParameter<DoubleValue>)Parameters["InverseLength"]; } 42 38 } 43 39 44 [Storable]45 private double sf2;46 [Storable]47 private readonly HyperParameter<DoubleValue> scaleParameter;48 40 public IValueParameter<DoubleValue> ScaleParameter { 49 get { return scaleParameter; }41 get { return (IValueParameter<DoubleValue>)Parameters["Scale"]; } 50 42 } 51 43 52 [Storable]53 private int d;54 [Storable]55 private readonly ConstrainedValueParameter<IntValue> dParameter;56 44 public IConstrainedValueParameter<IntValue> DParameter { 57 get { return dParameter; }45 get { return (IConstrainedValueParameter<IntValue>)Parameters["D"]; } 58 46 } 59 47 … … 66 54 private CovarianceMaternIso(CovarianceMaternIso original, Cloner cloner) 67 55 : base(original, cloner) { 68 this.scaleParameter = cloner.Clone(original.scaleParameter);69 this.sf2 = original.sf2;70 this.inverseLengthParameter = cloner.Clone(original.inverseLengthParameter);71 this.inverseLength = original.inverseLength;72 this.dParameter = cloner.Clone(original.dParameter);73 this.d = original.d;74 RegisterEvents();75 56 } 76 57 … … 80 61 Description = ItemDescription; 81 62 82 inverseLengthParameter = new HyperParameter<DoubleValue>("InverseLength", "The inverse length parameter of the isometric Matern covariance function.");83 scaleParameter = new HyperParameter<DoubleValue>("Scale", "The scale parameter of the isometric Matern covariance function.");63 Parameters.Add(new OptionalValueParameter<DoubleValue>("InverseLength", "The inverse length parameter of the isometric Matern covariance function.")); 64 Parameters.Add(new OptionalValueParameter<DoubleValue>("Scale", "The scale parameter of the isometric Matern covariance function.")); 84 65 var validDValues = new ItemSet<IntValue>(); 85 66 validDValues.Add((IntValue)new IntValue(1).AsReadOnly()); 86 67 validDValues.Add((IntValue)new IntValue(3).AsReadOnly()); 87 68 validDValues.Add((IntValue)new IntValue(5).AsReadOnly()); 88 dParameter = new ConstrainedValueParameter<IntValue>("D", "The d parameter (allowed values: 1, 3, or 5) of the isometric Matern covariance function.", validDValues, validDValues.First()); 89 d = dParameter.Value.Value; 90 91 Parameters.Add(inverseLengthParameter); 92 Parameters.Add(scaleParameter); 93 Parameters.Add(dParameter); 94 95 RegisterEvents(); 96 } 97 98 [StorableHook(HookType.AfterDeserialization)] 99 private void AfterDeserialization() { 100 RegisterEvents(); 69 Parameters.Add(new ConstrainedValueParameter<IntValue>("D", "The d parameter (allowed values: 1, 3, or 5) of the isometric Matern covariance function.", validDValues, validDValues.First())); 101 70 } 102 71 … … 105 74 } 106 75 107 // caching 108 private void RegisterEvents() { 109 Util.AttachValueChangeHandler<DoubleValue, double>(inverseLengthParameter, () => { inverseLength = inverseLengthParameter.Value.Value; }); 110 Util.AttachValueChangeHandler<DoubleValue, double>(scaleParameter, () => { sf2 = scaleParameter.Value.Value; }); 111 Util.AttachValueChangeHandler<IntValue, int>(dParameter, () => { d = dParameter.Value.Value; }); 76 public int GetNumberOfParameters(int numberOfVariables) { 77 return 78 (InverseLengthParameter.Value != null ? 0 : 1) + 79 (ScaleParameter.Value != null ? 0 : 1); 112 80 } 113 81 114 public int GetNumberOfParameters(int numberOfVariables) { 115 return 116 (inverseLengthParameter.Fixed ? 0 : 1) + 117 (scaleParameter.Fixed ? 0 : 1); 82 public void SetParameter(double[] p) { 83 double inverseLength, scale; 84 GetParameterValues(p, out scale, out inverseLength); 85 InverseLengthParameter.Value = new DoubleValue(inverseLength); 86 ScaleParameter.Value = new DoubleValue(scale); 118 87 } 119 88 120 public void SetParameter(double[] hyp) { 121 int i = 0; 122 if (!inverseLengthParameter.Fixed) { 123 inverseLengthParameter.SetValue(new DoubleValue(1.0 / Math.Exp(hyp[i]))); 124 i++; 89 private void GetParameterValues(double[] p, out double scale, out double inverseLength) { 90 // gather parameter values 91 int c = 0; 92 if (InverseLengthParameter.Value != null) { 93 inverseLength = InverseLengthParameter.Value.Value; 94 } else { 95 inverseLength = 1.0 / Math.Exp(p[c]); 96 c++; 125 97 } 126 if (!scaleParameter.Fixed) { 127 scaleParameter.SetValue(new DoubleValue(Math.Exp(2 * hyp[i]))); 128 i++; 98 99 if (ScaleParameter.Value != null) { 100 scale = ScaleParameter.Value.Value; 101 } else { 102 scale = Math.Exp(2 * p[c]); 103 c++; 129 104 } 130 if ( hyp.Length != i) throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovarianceMaternIso", "hyp");105 if (p.Length != c) throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovarianceMaternIso", "p"); 131 106 } 132 107 108 public ParameterizedCovarianceFunction GetParameterizedCovarianceFunction(double[] p, IEnumerable<int> columnIndices) { 109 double inverseLength, scale; 110 int d = DParameter.Value.Value; 111 GetParameterValues(p, out scale, out inverseLength); 112 // create functions 113 var cov = new ParameterizedCovarianceFunction(); 114 cov.Covariance = (x, i, j) => { 115 double dist = i == j 116 ? 0.0 117 : Math.Sqrt(Util.SqrDist(x, i, j, Math.Sqrt(d) * inverseLength, columnIndices)); 118 return scale * m(d, dist); 119 }; 120 cov.CrossCovariance = (x, xt, i, j) => { 121 double dist = Math.Sqrt(Util.SqrDist(x, i, xt, j, Math.Sqrt(d) * inverseLength, columnIndices)); 122 return scale * m(d, dist); 123 }; 124 cov.CovarianceGradient = (x, i, j) => GetGradient(x, i, j, d, scale, inverseLength, columnIndices); 125 return cov; 126 } 133 127 134 private double m(double t) {128 private static double m(int d, double t) { 135 129 double f; 136 130 switch (d) { … … 143 137 } 144 138 145 private double dm(double t) {139 private static double dm(int d, double t) { 146 140 double df; 147 141 switch (d) { … … 154 148 } 155 149 156 public double GetCovariance(double[,] x, int i, int j, IEnumerable<int> columnIndices) {157 double dist = i == j158 ? 0.0159 : Math.Sqrt(Util.SqrDist(x, i, j, Math.Sqrt(d) * inverseLength, columnIndices));160 return sf2 * m(dist);161 }162 150 163 p ublic IEnumerable<double> GetGradient(double[,] x, int i, int j, IEnumerable<int> columnIndices) {151 private static IEnumerable<double> GetGradient(double[,] x, int i, int j, int d, double scale, double inverseLength, IEnumerable<int> columnIndices) { 164 152 double dist = i == j 165 153 ? 0.0 166 154 : Math.Sqrt(Util.SqrDist(x, i, j, Math.Sqrt(d) * inverseLength, columnIndices)); 167 155 168 yield return sf2 * dm(dist); 169 yield return 2 * sf2 * m(dist); 170 } 171 172 public double GetCrossCovariance(double[,] x, double[,] xt, int i, int j, IEnumerable<int> columnIndices) { 173 double dist = Math.Sqrt(Util.SqrDist(x, i, xt, j, Math.Sqrt(d) * inverseLength, columnIndices)); 174 return sf2 * m(dist); 156 yield return scale * dm(d, dist); 157 yield return 2 * scale * m(d, dist); 175 158 } 176 159 }
Note: See TracChangeset
for help on using the changeset viewer.