Changeset 8463 for trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs
- Timestamp:
- 08/09/12 16:32:44 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs
r8455 r8463 73 73 private double[,] x; 74 74 [Storable] 75 private Scaling scaling; 75 private Scaling inputScaling; 76 [Storable] 77 private Scaling targetScaling; 76 78 77 79 … … 82 84 this.meanFunction = cloner.Clone(original.meanFunction); 83 85 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); 85 88 this.negativeLogLikelihood = original.negativeLogLikelihood; 86 89 this.targetVariable = original.targetVariable; … … 118 121 119 122 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); 124 129 125 130 int n = x.GetLength(0); … … 162 167 int n = x.GetLength(0); 163 168 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;167 169 168 170 int info; 169 alglib. densesolverreport denseSolveRep;170 171 alglib.spdmatrixcholesky solvem(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."); 173 175 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(); 179 181 180 182 double[] meanGradients = new double[meanFunction.GetNumberOfParameters(nAllowedVariables)]; … … 187 189 if (covGradients.Length > 0) { 188 190 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); 192 194 } 195 covGradients[k] += 0.5 * l[i, i] * covarianceFunction.GetGradient(i, i, k); 193 196 } 194 197 } 195 covGradients = covGradients.Select(g => g / 2.0).ToArray();196 198 } 197 199 … … 219 221 220 222 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); 222 224 int newN = newX.GetLength(0); 223 225 int n = x.GetLength(0); … … 251 253 // alglib.rmatrixsolvem(l, n, sWKs, newN, true, out info, out denseSolveRep, out v); 252 254 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 //} 260 265 261 266 }
Note: See TracChangeset
for help on using the changeset viewer.