Changeset 128
- Timestamp:
- 04/18/08 13:53:53 (17 years ago)
- Location:
- trunk/sources/HeuristicLab.StructureIdentification
- Files:
-
- 2 added
- 1 deleted
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.StructureIdentification/Evaluation/CoefficientOfDeterminationEvaluator.cs
r2 r128 31 31 32 32 namespace HeuristicLab.StructureIdentification { 33 public class CoefficientOfDeterminationEvaluator : OperatorBase {33 public class CoefficientOfDeterminationEvaluator : GPEvaluatorBase { 34 34 public override string Description { 35 get { return @"Applies 'OperatorTree' to samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) of 'Dataset' and calculates 36 the 'coefficient of determination' of estimated values vs. real values of 'TargetVariable'."; } 35 get { 36 return @"Applies 'OperatorTree' to all samples of 'Dataset' and calculates 37 the 'coefficient of determination' of estimated values vs. real values of 'TargetVariable'."; 38 } 37 39 } 38 40 39 41 public CoefficientOfDeterminationEvaluator() 40 42 : base() { 41 AddVariableInfo(new VariableInfo("OperatorTree", "The function tree that should be evaluated", typeof(IFunction), VariableKind.In));42 AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));43 AddVariableInfo(new VariableInfo("TargetVariable", "Index of the target variable in the dataset", typeof(IntData), VariableKind.In));44 AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataset on which the function should be evaluated", typeof(IntData), VariableKind.In));45 AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataset on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));46 AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));47 AddVariableInfo(new VariableInfo("UseEstimatedTargetValues", "When the function tree contains the target variable this variable determines " +48 "if we should use the estimated or the original values of the target variable in the evaluation", typeof(BoolData), VariableKind.In));49 AddVariableInfo(new VariableInfo("Quality", "The coefficient of determination of the model", typeof(DoubleData), VariableKind.New));50 51 43 } 52 44 53 54 private double[] savedTargetVariable = new double[1]; 55 public override IOperation Apply(IScope scope) { 56 int firstSampleIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data; 57 int lastSampleIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data; 58 59 if(lastSampleIndex < firstSampleIndex) { 60 throw new InvalidProgramException(); 61 } 62 63 IFunction function = GetVariableValue<IFunction>("OperatorTree", scope, true); 64 65 Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true); 66 67 int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data; 68 bool useEstimatedTargetValues = GetVariableValue<BoolData>("UseEstimatedTargetValues", scope, true).Data; 69 double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data; 70 71 if(useEstimatedTargetValues && savedTargetVariable.Length != lastSampleIndex - firstSampleIndex + 1) { 72 savedTargetVariable = new double[lastSampleIndex - firstSampleIndex + 1]; 73 } 74 75 double maximumPunishment = punishmentFactor * dataset.GetRange(targetVariable, firstSampleIndex, lastSampleIndex); 76 45 public override double Evaluate(IScope scope, IFunction function, int targetVariable, Dataset dataset) { 77 46 double errorsSquaredSum = 0.0; 78 double originalsSum = 0.0; 79 double targetMean = dataset.GetMean(targetVariable, firstSampleIndex, lastSampleIndex); 80 81 for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) { 47 double originalDeviationTotalSumOfSquares = 0.0; 48 double targetMean = dataset.GetMean(targetVariable); 49 for(int sample = 0; sample < dataset.Rows; sample++) { 82 50 double estimated = function.Evaluate(dataset, sample); 83 51 double original = dataset.GetValue(sample, targetVariable); 84 85 if(useEstimatedTargetValues) {86 savedTargetVariable[sample - firstSampleIndex] = original;87 dataset.SetValue(sample, targetVariable, estimated);88 }89 90 52 if(!double.IsNaN(original) && !double.IsInfinity(original)) { 91 53 if(double.IsNaN(estimated) || double.IsInfinity(estimated)) … … 98 60 double error = estimated - original; 99 61 errorsSquaredSum += error * error; 100 originalsSum += original; 62 63 double origDeviation = original - targetMean; 64 originalDeviationTotalSumOfSquares += origDeviation * origDeviation; 101 65 } 102 66 } 103 104 double originalsMean = originalsSum / (lastSampleIndex - firstSampleIndex +1); 105 106 double originalTotalSumOfSquares = 0.0; 107 108 for(int sample=0; sample <savedTargetVariable.Length; sample++) { 109 double original = savedTargetVariable[sample]; 110 111 if(!double.IsInfinity(original) && !double.IsNaN(original)) { 112 original = original - originalsMean; 113 originalTotalSumOfSquares += original * original; 114 } 115 } 116 117 double quality = 1 - errorsSquaredSum / originalTotalSumOfSquares; 118 119 if(quality > 1) { 67 double quality = 1 - errorsSquaredSum / originalDeviationTotalSumOfSquares; 68 if(quality > 1) 120 69 throw new InvalidProgramException(); 121 } 122 123 if(double.IsNaN(quality) || double.IsInfinity(quality)) { 70 if(double.IsNaN(quality) || double.IsInfinity(quality)) 124 71 quality = double.MaxValue; 125 } 126 127 if(useEstimatedTargetValues) { 128 // restore original values of the target variable 129 for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) { 130 dataset.SetValue(sample, targetVariable, savedTargetVariable[sample - firstSampleIndex]); 131 } 132 } 133 134 scope.AddVariable(new HeuristicLab.Core.Variable("Quality", new DoubleData(quality))); 135 return null; 72 return quality; 136 73 } 137 74 } -
trunk/sources/HeuristicLab.StructureIdentification/Evaluation/MeanSquaredErrorEvaluator.cs
r2 r128 31 31 32 32 namespace HeuristicLab.StructureIdentification { 33 public class MeanSquaredErrorEvaluator : OperatorBase {33 public class MeanSquaredErrorEvaluator : GPEvaluatorBase { 34 34 public override string Description { 35 get { return @"Evaluates 'OperatorTree' for samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) and calculates the mean-squared-error 36 for the estimated values vs. the real values of 'TargetVariable'."; } 35 get { 36 return @"Evaluates 'OperatorTree' for all samples of 'DataSet' and calculates the mean-squared-error 37 for the estimated values vs. the real values of 'TargetVariable'."; 38 } 37 39 } 38 40 39 41 public MeanSquaredErrorEvaluator() 40 42 : base() { 41 AddVariableInfo(new VariableInfo("OperatorTree", "The function tree that should be evaluated", typeof(IFunction), VariableKind.In));42 AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));43 AddVariableInfo(new VariableInfo("TargetVariable", "Index of the column of the dataset that holds the target variable", typeof(IntData), VariableKind.In));44 AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataset on which the function should be evaluated", typeof(IntData), VariableKind.In));45 AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataset on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));46 AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));47 AddVariableInfo(new VariableInfo("UseEstimatedTargetValues", "When the function tree contains the target variable this variable determines " +48 "if we should use the estimated or the original values of the target variable in the evaluation", typeof(BoolData), VariableKind.In));49 AddVariableInfo(new VariableInfo("Quality", "The mean squared error of the model", typeof(DoubleData), VariableKind.New));50 43 } 51 44 52 private double[] savedTargetVariable = new double[0]; 53 54 public override IOperation Apply(IScope scope) { 55 56 int firstSampleIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data; 57 int lastSampleIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data; 58 59 if(firstSampleIndex >= lastSampleIndex) { 60 throw new InvalidProgramException(); 61 } 62 63 64 int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data; 65 Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true); 66 67 IFunction function = GetVariableValue<IFunction>("OperatorTree", scope, true); 68 45 public override double Evaluate(IScope scope, IFunction function, int targetVariable, Dataset dataset) { 69 46 double errorsSquaredSum = 0; 70 71 double maximumPunishment = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data * dataset.GetRange(targetVariable, firstSampleIndex, lastSampleIndex); 72 double targetMean = dataset.GetMean(targetVariable, firstSampleIndex, lastSampleIndex); 73 bool useEstimatedValues = GetVariableValue<BoolData>("UseEstimatedTargetValues", scope, true).Data; 74 75 if(useEstimatedValues && savedTargetVariable.Length != lastSampleIndex - firstSampleIndex + 1) { 76 savedTargetVariable = new double[lastSampleIndex - firstSampleIndex + 1]; 77 } 78 for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) { 79 47 double targetMean = dataset.GetMean(targetVariable); 48 for(int sample = 0; sample < dataset.Rows; sample++) { 80 49 double estimated = function.Evaluate(dataset, sample); 81 50 double original = dataset.GetValue(sample, targetVariable); 82 83 if(useEstimatedValues) {84 savedTargetVariable[sample - firstSampleIndex] = original;85 dataset.SetValue(sample, targetVariable, estimated);86 }87 88 51 if(double.IsNaN(estimated) || double.IsInfinity(estimated)) { 89 52 estimated = targetMean + maximumPunishment; … … 93 56 estimated = targetMean - maximumPunishment; 94 57 } 95 96 58 double error = estimated - original; 97 59 errorsSquaredSum += error * error; 98 60 } 99 100 errorsSquaredSum /= (lastSampleIndex - firstSampleIndex); 61 errorsSquaredSum /= dataset.Rows; 101 62 if(double.IsNaN(errorsSquaredSum) || double.IsInfinity(errorsSquaredSum)) { 102 63 errorsSquaredSum = double.MaxValue; 103 64 } 104 105 if(useEstimatedValues) { 106 // restore original values of the target variable 107 for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) { 108 dataset.SetValue(sample, targetVariable, savedTargetVariable[sample - firstSampleIndex]); 109 } 110 } 111 112 scope.AddVariable(new HeuristicLab.Core.Variable("Quality", new DoubleData(errorsSquaredSum))); 113 return null; 65 return errorsSquaredSum; 114 66 } 115 67 } -
trunk/sources/HeuristicLab.StructureIdentification/Evaluation/VarianceAccountedForEvaluator.cs
r2 r128 31 31 32 32 namespace HeuristicLab.StructureIdentification { 33 public class VarianceAccountedForEvaluator : OperatorBase {33 public class VarianceAccountedForEvaluator : GPEvaluatorBase { 34 34 public override string Description { 35 get { return @"Evaluates 'OperatorTree' for samples 'FirstSampleIndex' - 'LastSampleIndex' (inclusive) and calculates 35 get { 36 return @"Evaluates 'OperatorTree' for all samples of 'DataSet' and calculates 36 37 the variance-accounted-for quality measure for the estimated values vs. the real values of 'TargetVariable'. 37 38 38 39 The Variance Accounted For (VAF) function is computed as 39 40 VAF(y,y') = ( 1 - var(y-y')/var(y) ) 40 where y' denotes the predicted / modelled values for y and var(x) the variance of a signal x."; } 41 where y' denotes the predicted / modelled values for y and var(x) the variance of a signal x."; 42 } 41 43 } 42 44 … … 48 50 public VarianceAccountedForEvaluator() 49 51 : base() { 50 AddVariableInfo(new VariableInfo("OperatorTree", "The function tree that should be evaluated", typeof(IFunction), VariableKind.In));51 AddVariableInfo(new VariableInfo("Dataset", "Dataset with all samples on which to apply the function", typeof(Dataset), VariableKind.In));52 AddVariableInfo(new VariableInfo("TargetVariable", "Index of the target variable in the dataset", typeof(IntData), VariableKind.In));53 AddVariableInfo(new VariableInfo("FirstSampleIndex", "Index of the first row of the dataset on which the function should be evaluated", typeof(IntData), VariableKind.In));54 AddVariableInfo(new VariableInfo("LastSampleIndex", "Index of the last row of the dataset on which the function should be evaluated (inclusive)", typeof(IntData), VariableKind.In));55 AddVariableInfo(new VariableInfo("PunishmentFactor", "Punishment factor for invalid estimations", typeof(DoubleData), VariableKind.In));56 AddVariableInfo(new VariableInfo("UseEstimatedTargetValues", "When the function tree contains the target variable this variable determines " +57 "if we should use the estimated or the original values of the target variable in the evaluation", typeof(BoolData), VariableKind.In));58 AddVariableInfo(new VariableInfo("Quality", "Variance accounted for quality of the model", typeof(DoubleData), VariableKind.New));59 60 52 } 61 53 62 54 63 private double[] originalTargetVariableValues = new double[1]; 64 private double[] errors = new double[1]; 65 66 public override IOperation Apply(IScope scope) { 67 68 int firstSampleIndex = GetVariableValue<IntData>("FirstSampleIndex", scope, true).Data; 69 int lastSampleIndex = GetVariableValue<IntData>("LastSampleIndex", scope, true).Data; 70 71 if(lastSampleIndex < firstSampleIndex) { 72 throw new InvalidProgramException(); 73 } 74 75 IFunction function = GetVariableValue<IFunction>("OperatorTree", scope, true); 76 77 Dataset dataset = GetVariableValue<Dataset>("Dataset", scope, true); 78 79 int targetVariable = GetVariableValue<IntData>("TargetVariable", scope, true).Data; 80 bool useEstimatedTargetValues = GetVariableValue<BoolData>("UseEstimatedTargetValues", scope, true).Data; 81 double punishmentFactor = GetVariableValue<DoubleData>("PunishmentFactor", scope, true).Data; 82 83 if(originalTargetVariableValues.Length != lastSampleIndex - firstSampleIndex + 1) { 84 originalTargetVariableValues = new double[lastSampleIndex - firstSampleIndex + 1]; 85 errors = new double[lastSampleIndex - firstSampleIndex + 1]; 86 } 87 88 double maximumPunishment = punishmentFactor * dataset.GetRange(targetVariable, firstSampleIndex, lastSampleIndex); 89 90 double targetMean = dataset.GetMean(targetVariable, firstSampleIndex, lastSampleIndex); 91 92 for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) { 93 55 public override double Evaluate(IScope scope, IFunction function, int targetVariable, Dataset dataset) { 56 double[] errors = new double[dataset.Rows]; 57 double[] originalTargetVariableValues = new double[dataset.Rows]; 58 double targetMean = dataset.GetMean(targetVariable); 59 for(int sample = 0; sample < dataset.Rows; sample++) { 94 60 double estimated = function.Evaluate(dataset, sample); 95 double original = dataset.GetValue(sample, targetVariable); 96 61 double original = dataset.GetValue(sample, targetVariable); 97 62 if(!double.IsNaN(original) && !double.IsInfinity(original)) { 98 63 if(double.IsNaN(estimated) || double.IsInfinity(estimated)) … … 104 69 } 105 70 106 errors[sample-firstSampleIndex] = original - estimated; 107 originalTargetVariableValues[sample-firstSampleIndex] = original; 108 if(useEstimatedTargetValues) { 109 dataset.SetValue(sample, targetVariable, estimated); 110 } 71 errors[sample] = original - estimated; 72 originalTargetVariableValues[sample] = original; 111 73 } 112 74 … … 118 80 quality = double.MaxValue; 119 81 } 120 121 if(useEstimatedTargetValues) { 122 // restore original values of the target variable 123 for(int sample = firstSampleIndex; sample <= lastSampleIndex; sample++) { 124 dataset.SetValue(sample, targetVariable, originalTargetVariableValues[sample - firstSampleIndex]); 125 } 126 } 127 128 scope.AddVariable(new HeuristicLab.Core.Variable("Quality", new DoubleData(quality))); 129 return null; 82 return quality; 130 83 } 131 84 } -
trunk/sources/HeuristicLab.StructureIdentification/HeuristicLab.StructureIdentification.csproj
r89 r128 49 49 <ItemGroup> 50 50 <Compile Include="Evaluation\CoefficientOfDeterminationEvaluator.cs" /> 51 <Compile Include="Evaluation\FunctionEvaluator.cs"> 52 <SubType>Code</SubType> 53 </Compile> 51 <Compile Include="Evaluation\GPEvaluatorBase.cs" /> 52 <Compile Include="Evaluation\EarlyStoppingMeanSquaredErrorEvaluator.cs" /> 54 53 <Compile Include="Evaluation\MeanSquaredErrorEvaluator.cs" /> 55 54 <Compile Include="Evaluation\VarianceAccountedForEvaluator.cs" />
Note: See TracChangeset
for help on using the changeset viewer.