Changeset 15859
- Timestamp:
- 03/23/18 15:41:02 (7 years ago)
- Location:
- branches/2886_SymRegGrammarEnumeration
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2886_SymRegGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration/Analysis/RSquaredEvaluator.cs
r15824 r15859 1 1 using System; 2 using System.Diagnostics; 2 3 using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration.GrammarEnumeration; 3 4 using HeuristicLab.Common; … … 63 64 64 65 private void EvaluateSentence(GrammarEnumerationAlgorithm algorithm, SymbolString symbolString) { 66 var problemData = algorithm.Problem.ProblemData; 67 65 68 SymbolicExpressionTree tree = algorithm.Grammar.ParseSymbolicExpressionTree(symbolString); 69 Debug.Assert(SymbolicRegressionConstantOptimizationEvaluator.CanOptimizeConstants(tree)); 66 70 67 var problemData = algorithm.Problem.ProblemData; 71 // TODO: Initialize constant values randomly 72 // TODO: Restarts 73 74 double r2 = SymbolicRegressionConstantOptimizationEvaluator.OptimizeConstants(expressionTreeLinearInterpreter, 75 tree, 76 problemData, 77 problemData.TrainingIndices, 78 applyLinearScaling: false, 79 maxIterations: 200, 80 updateVariableWeights: true, 81 updateConstantsInTree: true); 82 83 foreach (var symbolicExpressionTreeNode in tree.IterateNodesPostfix()) { 84 ConstantTreeNode constTreeNode = symbolicExpressionTreeNode as ConstantTreeNode; 85 if (constTreeNode != null && constTreeNode.Value.IsAlmost(0.0)) { 86 constTreeNode.Value = 0.0; 87 } 88 } 89 68 90 SymbolicRegressionModel model = new SymbolicRegressionModel( 69 91 problemData.TargetVariable, … … 71 93 expressionTreeLinearInterpreter); 72 94 73 var target = problemData.TargetVariableTrainingValues;74 var estVals = model.GetEstimatedValues(problemData.Dataset, problemData.TrainingIndices);75 OnlineCalculatorError error;76 varr2 = OnlinePearsonsRCalculator.Calculate(target, estVals, out error);77 if (error != OnlineCalculatorError.None) r2 = 0.0;95 //var target = problemData.TargetVariableTrainingValues; 96 //var estVals = model.GetEstimatedValues(problemData.Dataset, problemData.TrainingIndices); 97 //OnlineCalculatorError error; 98 //r2 = OnlinePearsonsRCalculator.Calculate(target, estVals, out error); 99 //if (error != OnlineCalculatorError.None) r2 = 0.0; 78 100 79 101 var bestR2Result = (DoubleValue)algorithm.Results[BestTrainingQualityResultName].Value; 80 if (r2 > bestR2Result.Value) { 102 bool better = r2 > bestR2Result.Value; 103 bool equallyGood = r2.IsAlmost(bestR2Result.Value); 104 bool shorter = algorithm.BestTrainingSentence != null && symbolString.Count() < algorithm.BestTrainingSentence.Count(); 105 if (better || (equallyGood && shorter)) { 81 106 bestR2Result.Value = r2; 82 107 algorithm.Results.AddOrUpdateResult(BestTrainingModelResultName, model); -
branches/2886_SymRegGrammarEnumeration/Test/GrammarEnumerationTest.cs
r15849 r15859 200 200 EvaluateGrammarEnumeration(); 201 201 } 202 203 [TestMethod] 204 [TestProperty("Goal", "structure search + const op")] 205 public void Constants_Nguyen7() { 206 // log(x+1) + log(x*x + 1) 207 alg.MaxTreeSize = 22; 208 alg.Problem.ProblemData = new NguyenFunctionSeven().GenerateRegressionData(); 209 210 alg.Start(); 211 212 TerminalSymbol constSymbol = alg.Grammar.Const; 213 TerminalSymbol varSymbol = alg.Grammar.VarTerminals.First(); 214 TerminalSymbol mulSymbol = alg.Grammar.Multiplication; 215 TerminalSymbol addSymbol = alg.Grammar.Addition; 216 TerminalSymbol logSymbol = alg.Grammar.Log; 217 218 SymbolString targetSolution = new SymbolString(new[] { 219 varSymbol, constSymbol, mulSymbol, constSymbol, addSymbol, logSymbol, constSymbol, mulSymbol, 220 varSymbol, varSymbol, mulSymbol, constSymbol, mulSymbol, constSymbol, addSymbol, logSymbol, constSymbol, mulSymbol, addSymbol, 221 constSymbol, addSymbol 222 }); 223 224 int targetSolutionHash = alg.Grammar.Hasher.CalcHashCode(targetSolution); 225 int actualSolutionHash = alg.Grammar.Hasher.CalcHashCode(alg.BestTrainingSentence); 226 227 Assert.IsTrue(alg.DistinctSentencesLength.ContainsKey(targetSolutionHash), "Actual solution was not generated!"); 228 Assert.AreEqual(targetSolutionHash, actualSolutionHash, "Actual solution was not recognized as best one."); 229 230 231 // Evaluate 232 EvaluateGrammarEnumeration(); 233 } 234 235 [TestMethod] 236 [TestProperty("Goal", "structure search + const op")] 237 public void Constants_Nguyen12() { 238 // x*x*x*x - x*x*x + y*y/2 -y 239 alg.MaxTreeSize = 28; 240 alg.Problem.ProblemData = new NguyenFunctionTwelve().GenerateRegressionData(); 241 242 alg.Start(); 243 244 // Evaluate 245 EvaluateGrammarEnumeration(); 246 } 247 248 [TestMethod] 249 [TestProperty("Goal", "structure search + const op")] 250 public void Constants_Keijzer3() { 251 // 0.3*x*sin(2*pi*x) 252 alg.MaxTreeSize = 20; 253 alg.Problem.ProblemData = new KeijzerFunctionThree().GenerateRegressionData(); 254 255 alg.Start(); 256 257 TerminalSymbol constSymbol = alg.Grammar.Const; 258 TerminalSymbol varSymbol = alg.Grammar.VarTerminals.First(); 259 TerminalSymbol mulSymbol = alg.Grammar.Multiplication; 260 TerminalSymbol addSymbol = alg.Grammar.Addition; 261 262 SymbolString targetSolution = new SymbolString(new[] { 263 constSymbol, varSymbol, mulSymbol, constSymbol, addSymbol, alg.Grammar.Sin, 264 varSymbol, mulSymbol, 265 constSymbol, mulSymbol, 266 constSymbol, addSymbol 267 }); 268 269 int targetSolutionHash = alg.Grammar.Hasher.CalcHashCode(targetSolution); 270 int actualSolutionHash = alg.Grammar.Hasher.CalcHashCode(alg.BestTrainingSentence); 271 272 Assert.IsTrue(alg.DistinctSentencesLength.ContainsKey(targetSolutionHash), "Actual solution was not generated!"); 273 274 Assert.AreEqual(targetSolutionHash, actualSolutionHash, "Actual solution was not recognized as best one."); 275 276 // Evaluate 277 EvaluateGrammarEnumeration(); 278 } 279 280 [TestMethod] 281 [TestProperty("Goal", "structure search + const op")] 282 public void Constants_Keijzer5() { 283 // (30*x*z) / ((x - 10)*y*y) 284 alg.MaxTreeSize = 24; 285 alg.Problem.ProblemData = new KeijzerFunctionFive().GenerateRegressionData(); 286 287 alg.Start(); 288 289 TerminalSymbol constSymbol = alg.Grammar.Const; 290 TerminalSymbol xSymbol = alg.Grammar.VarTerminals.First(s => s.StringRepresentation == "X"); 291 TerminalSymbol ySymbol = alg.Grammar.VarTerminals.First(s => s.StringRepresentation == "Y"); 292 TerminalSymbol zSymbol = alg.Grammar.VarTerminals.First(s => s.StringRepresentation == "Z"); 293 TerminalSymbol mulSymbol = alg.Grammar.Multiplication; 294 TerminalSymbol addSymbol = alg.Grammar.Addition; 295 TerminalSymbol invSymbol = alg.Grammar.Inv; 296 297 // 30 * x * z * 1/(x*y*y - 10*y*y) 298 // --> x z * c * x y * y * c * y y * c * + c + inv c + 299 SymbolString targetSolution = new SymbolString(new[] { 300 xSymbol, zSymbol, mulSymbol, constSymbol, mulSymbol, 301 xSymbol, ySymbol, mulSymbol, ySymbol, mulSymbol, constSymbol, mulSymbol, 302 ySymbol, ySymbol, mulSymbol, constSymbol, mulSymbol, addSymbol, constSymbol, addSymbol, invSymbol, 303 constSymbol, addSymbol 304 }); 305 306 int targetSolutionHash = alg.Grammar.Hasher.CalcHashCode(targetSolution); 307 int actualSolutionHash = alg.Grammar.Hasher.CalcHashCode(alg.BestTrainingSentence); 308 309 Assert.IsTrue(alg.DistinctSentencesLength.ContainsKey(targetSolutionHash), "Actual solution was not generated!"); 310 311 Assert.AreEqual(targetSolutionHash, actualSolutionHash, "Actual solution was not recognized as best one."); 312 313 // Evaluate 314 EvaluateGrammarEnumeration(); 315 } 316 317 318 [TestMethod] 319 [TestProperty("Goal", "structure search + const op")] 320 public void Constants_Keijzer12() { 321 // x*x*x*x - x*x*x + y*y/2 - y 322 alg.MaxTreeSize = 29; 323 alg.Problem.ProblemData = new KeijzerFunctionTwelve().GenerateRegressionData(); 324 325 alg.Start(); 326 327 TerminalSymbol constSymbol = alg.Grammar.Const; 328 TerminalSymbol xSymbol = alg.Grammar.VarTerminals.First(); 329 TerminalSymbol ySymbol = alg.Grammar.VarTerminals.Last(); 330 TerminalSymbol mulSymbol = alg.Grammar.Multiplication; 331 TerminalSymbol addSymbol = alg.Grammar.Addition; 332 333 SymbolString targetSolution = new SymbolString(new[] { 334 xSymbol, xSymbol, mulSymbol, xSymbol, mulSymbol, xSymbol, mulSymbol, constSymbol, mulSymbol, 335 xSymbol, xSymbol, mulSymbol, xSymbol, mulSymbol, constSymbol, mulSymbol, addSymbol, 336 ySymbol, ySymbol, mulSymbol, constSymbol, mulSymbol, addSymbol, 337 ySymbol, constSymbol, mulSymbol, addSymbol, 338 constSymbol, addSymbol 339 }); 340 341 var x = alg.Grammar.ToInfixString(targetSolution); 342 343 int targetSolutionHash = alg.Grammar.Hasher.CalcHashCode(targetSolution); 344 int actualSolutionHash = alg.Grammar.Hasher.CalcHashCode(alg.BestTrainingSentence); 345 346 Assert.IsTrue(alg.DistinctSentencesLength.ContainsKey(targetSolutionHash), "Actual solution was not generated!"); 347 Assert.AreEqual(targetSolutionHash, actualSolutionHash, "Actual solution was not recognized as best one."); 348 349 // Evaluate 350 EvaluateGrammarEnumeration(); 351 } 352 353 [TestMethod] 354 [TestProperty("Goal", "structure search + const op")] 355 public void Constants_Keijzer14() { 356 // 8 / (2 + x*x + y*y 357 alg.MaxTreeSize = 19; 358 alg.Problem.ProblemData = new KeijzerFunctionFourteen().GenerateRegressionData(); 359 360 alg.Start(); 361 362 TerminalSymbol constSymbol = alg.Grammar.Const; 363 TerminalSymbol xSymbol = alg.Grammar.VarTerminals.First(); 364 TerminalSymbol ySymbol = alg.Grammar.VarTerminals.Last(); 365 TerminalSymbol mulSymbol = alg.Grammar.Multiplication; 366 TerminalSymbol addSymbol = alg.Grammar.Addition; 367 TerminalSymbol divSymbol = alg.Grammar.Inv; 368 369 370 // x x mul c mul y y mul c mul add const add inv const mul const add 371 SymbolString targetSolution = new SymbolString(new[] { 372 xSymbol, xSymbol, mulSymbol, constSymbol, mulSymbol, 373 ySymbol, ySymbol, mulSymbol, constSymbol, mulSymbol, addSymbol, 374 constSymbol, addSymbol, divSymbol, 375 constSymbol, mulSymbol, 376 constSymbol, addSymbol 377 }); 378 379 int targetSolutionHash = alg.Grammar.Hasher.CalcHashCode(targetSolution); 380 int actualSolutionHash = alg.Grammar.Hasher.CalcHashCode(alg.BestTrainingSentence); 381 382 Assert.IsTrue(alg.DistinctSentencesLength.ContainsKey(targetSolutionHash), "Actual solution was not generated!"); 383 Assert.AreEqual(targetSolutionHash, actualSolutionHash, "Actual solution was not recognized as best one."); 384 385 // Evaluate 386 EvaluateGrammarEnumeration(); 387 } 388 389 390 [TestMethod] 391 [TestProperty("Goal", "structure search + const op")] 392 public void Constants_Keijzer15() { 393 // x*x*x / 5 + y*y*y / 2 - y - x 394 alg.MaxTreeSize = 25; 395 alg.Problem.ProblemData = new KeijzerFunctionFifteen().GenerateRegressionData(); 396 397 alg.Start(); 398 399 TerminalSymbol constSymbol = alg.Grammar.Const; 400 TerminalSymbol xSymbol = alg.Grammar.VarTerminals.First(); 401 TerminalSymbol ySymbol = alg.Grammar.VarTerminals.Last(); 402 TerminalSymbol mulSymbol = alg.Grammar.Multiplication; 403 TerminalSymbol addSymbol = alg.Grammar.Addition; 404 405 // x x * x * const * y y * y * const * + y const * + x const * const + 406 SymbolString targetSolution = new SymbolString(new[] { 407 xSymbol, xSymbol, mulSymbol, xSymbol, mulSymbol, constSymbol, mulSymbol, 408 ySymbol, ySymbol, mulSymbol, ySymbol, mulSymbol, constSymbol, mulSymbol, addSymbol, 409 ySymbol, constSymbol, mulSymbol, addSymbol, 410 xSymbol, constSymbol, mulSymbol, addSymbol, 411 constSymbol, addSymbol 412 }); 413 414 int targetSolutionHash = alg.Grammar.Hasher.CalcHashCode(targetSolution); 415 int actualSolutionHash = alg.Grammar.Hasher.CalcHashCode(alg.BestTrainingSentence); 416 417 Assert.IsTrue(alg.DistinctSentencesLength.ContainsKey(targetSolutionHash), "Actual solution was not generated!"); 418 Assert.AreEqual(targetSolutionHash, actualSolutionHash, "Actual solution was not recognized as best one."); 419 420 // Evaluate 421 EvaluateGrammarEnumeration(); 422 } 423 424 202 425 203 426
Note: See TracChangeset
for help on using the changeset viewer.