Changeset 3884 for trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3
- Timestamp:
- 06/01/10 17:58:03 (14 years ago)
- Location:
- trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3
- Files:
-
- 2 added
- 1 deleted
- 5 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisProblem.cs
r3877 r3884 71 71 72 72 #region events 73 protected virtual void OnDataAnalysisProblemChanged(EventArgs e) { } 73 protected virtual void OnDataAnalysisProblemChanged(EventArgs e) { 74 RaiseReset(e); 75 } 74 76 75 77 private void RegisterParameterEvents() { -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs
r3710 r3884 36 36 [StorableClass] 37 37 public abstract class DataAnalysisSolution : NamedItem { 38 protected DataAnalysisSolution() 39 : base() { } 40 protected DataAnalysisSolution(DataAnalysisProblemData problemData) : this(problemData, double.NegativeInfinity, double.PositiveInfinity) { } 41 protected DataAnalysisSolution(DataAnalysisProblemData problemData, double lowerEstimationLimit, double upperEstimationLimit) 42 : this() { 43 this.problemData = problemData; 44 this.lowerEstimationLimit = lowerEstimationLimit; 45 this.upperEstimationLimit = upperEstimationLimit; 46 Initialize(); 47 } 48 49 [StorableConstructor] 50 private DataAnalysisSolution(bool deserializing) : base(deserializing) { } 51 [StorableHook(HookType.AfterDeserialization)] 52 private void Initialize() { 53 if (problemData != null) RegisterProblemDataEvents(); 54 } 55 38 56 [Storable] 39 57 private DataAnalysisProblemData problemData; … … 43 61 if (problemData != value) { 44 62 if (value == null) throw new ArgumentNullException(); 63 if (model != null && problemData != null && !problemData.InputVariables.Select(c => c.Value).SequenceEqual( 64 value.InputVariables.Select(c => c.Value))) 65 throw new ArgumentException("Could not set new problem data with different structure"); 66 45 67 if (problemData != null) DeregisterProblemDataEvents(); 46 68 problemData = value; 47 69 RegisterProblemDataEvents(); 48 OnProblemDataChanged( EventArgs.Empty);70 OnProblemDataChanged(); 49 71 } 50 72 } 51 73 } 74 75 [Storable] 76 private IDataAnalysisModel model; 77 public IDataAnalysisModel Model { 78 get { return model; } 79 set { 80 if (model != value) { 81 if (value == null) throw new ArgumentNullException(); 82 model = value; 83 OnModelChanged(); 84 } 85 } 86 } 87 52 88 [Storable] 53 89 private double lowerEstimationLimit; … … 57 93 if (lowerEstimationLimit != value) { 58 94 lowerEstimationLimit = value; 59 OnEstimatedValuesChanged(EventArgs.Empty);95 RecalculateEstimatedValues(); 60 96 } 61 97 } … … 69 105 if (upperEstimationLimit != value) { 70 106 upperEstimationLimit = value; 71 OnEstimatedValuesChanged(EventArgs.Empty);107 RecalculateEstimatedValues(); 72 108 } 73 109 } … … 77 113 public abstract IEnumerable<double> EstimatedTrainingValues { get; } 78 114 public abstract IEnumerable<double> EstimatedTestValues { get; } 79 80 protected DataAnalysisSolution() : base() { 81 Name = ItemName; 82 Description = ItemDescription; 83 } 84 protected DataAnalysisSolution(DataAnalysisProblemData problemData) : this(problemData, double.NegativeInfinity, double.PositiveInfinity) { } 85 protected DataAnalysisSolution(DataAnalysisProblemData problemData, double lowerEstimationLimit, double upperEstimationLimit) 86 : this() { 87 this.problemData = problemData; 88 this.lowerEstimationLimit = lowerEstimationLimit; 89 this.upperEstimationLimit = upperEstimationLimit; 90 Initialize(); 91 } 92 93 [StorableConstructor] 94 private DataAnalysisSolution(bool deserializing) : base(deserializing) { } 95 96 [StorableHook(HookType.AfterDeserialization)] 97 private void Initialize() { 98 if (problemData != null) RegisterProblemDataEvents(); 99 } 100 101 public override IDeepCloneable Clone(Cloner cloner) { 102 DataAnalysisSolution clone = (DataAnalysisSolution)base.Clone(cloner); 103 // don't clone the problem data! 104 clone.problemData = problemData; 105 clone.lowerEstimationLimit = lowerEstimationLimit; 106 clone.upperEstimationLimit = upperEstimationLimit; 107 clone.Initialize(); 108 return clone; 109 } 115 protected abstract void RecalculateEstimatedValues(); 110 116 111 117 #region Events … … 116 122 ProblemData.ProblemDataChanged += new EventHandler(ProblemData_Changed); 117 123 } 118 119 124 private void ProblemData_Changed(object sender, EventArgs e) { 120 OnProblemDataChanged( EventArgs.Empty);125 OnProblemDataChanged(); 121 126 } 122 127 123 128 public event EventHandler ProblemDataChanged; 124 protected virtual void OnProblemDataChanged(EventArgs e) { 129 protected virtual void OnProblemDataChanged() { 130 RecalculateEstimatedValues(); 125 131 var listeners = ProblemDataChanged; 126 132 if (listeners != null) 127 listeners(this, e); 133 listeners(this, EventArgs.Empty); 134 } 135 136 public event EventHandler ModelChanged; 137 protected virtual void OnModelChanged() { 138 RecalculateEstimatedValues(); 139 EventHandler handler = ModelChanged; 140 if (handler != null) 141 handler(this, EventArgs.Empty); 128 142 } 129 143 130 144 public event EventHandler EstimatedValuesChanged; 131 protected virtual void OnEstimatedValuesChanged( EventArgs e) {145 protected virtual void OnEstimatedValuesChanged() { 132 146 var listeners = EstimatedValuesChanged; 133 147 if (listeners != null) 134 listeners(this, e);148 listeners(this, EventArgs.Empty); 135 149 } 136 150 #endregion 151 152 public override IDeepCloneable Clone(Cloner cloner) { 153 DataAnalysisSolution clone = (DataAnalysisSolution)base.Clone(cloner); 154 // don't clone the problem data! 155 clone.problemData = problemData; 156 clone.Model = (IDataAnalysisModel)cloner.Clone(model); 157 clone.lowerEstimationLimit = lowerEstimationLimit; 158 clone.upperEstimationLimit = upperEstimationLimit; 159 clone.Initialize(); 160 return clone; 161 } 137 162 } 138 163 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj
r3877 r3884 98 98 <Compile Include="Evaluators\SimpleVarianceAccountedForEvaluator.cs" /> 99 99 <Compile Include="HeuristicLabProblemsDataAnalysisPlugin.cs" /> 100 <Compile Include="Interfaces\IDataAnalysisModel.cs" /> 100 101 <Compile Include="Interfaces\IDataAnalysisProblem.cs" /> 101 102 <Compile Include="MatrixExtensions.cs" /> 102 103 <Compile Include="Properties\AssemblyInfo.cs" /> 104 <Compile Include="SupportVectorMachine\ParameterAdjustmentProblem\SupportVectorRegressionParameterAdjustmentBestSolutionAnalyzer.cs" /> 103 105 <Compile Include="SupportVectorMachine\ParameterAdjustmentProblem\SupportVectorRegressionParameterAdjustmentEvaluator.cs" /> 104 106 <Compile Include="SupportVectorMachine\ParameterAdjustmentProblem\SupportVectorRegressionParameterAdjustmentProblem.cs" /> -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentEvaluator.cs
r3883 r3884 34 34 35 35 namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine.ParameterAdjustmentProblem { 36 [Item("SupportVector RegressionParameterAdjustmentEvaluator", "")]36 [Item("SupportVectorMachineParameterAdjustmentEvaluator", "")] 37 37 [StorableClass] 38 public class SupportVector RegressionParameterAdjustmentEvaluator : AlgorithmOperator, ISingleObjectiveEvaluator {38 public class SupportVectorMachineParameterAdjustmentEvaluator : AlgorithmOperator, ISingleObjectiveEvaluator { 39 39 private const string ParameterVectorParameterName = "ParameterVector"; 40 40 private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData"; … … 112 112 #endregion 113 113 114 public SupportVector RegressionParameterAdjustmentEvaluator()114 public SupportVectorMachineParameterAdjustmentEvaluator() 115 115 : base() { 116 116 StringValue nuSvrType = new StringValue("NU_SVR").AsReadOnly(); … … 141 141 GammaParameter.Value = new DoubleValue(Math.Pow(2, point[2])); 142 142 EpsilonParameter.Value = new DoubleValue(); 143 144 143 return base.Apply(); 145 144 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentProblem.cs
r3883 r3884 36 36 37 37 namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine.ParameterAdjustmentProblem { 38 [Item("Support Vector RegressionParameter Adjustment Problem", "Represents the problem of finding good parameter settings for support vector machines.")]38 [Item("Support Vector Machine Parameter Adjustment Problem", "Represents the problem of finding good parameter settings for support vector machines.")] 39 39 [StorableClass] 40 40 [Creatable("Problems")] 41 public sealed class SupportVector RegressionParameterAdjustmentProblem : DataAnalysisProblem, ISingleObjectiveProblem {41 public sealed class SupportVectorMachineParameterAdjustmentProblem : DataAnalysisProblem, ISingleObjectiveProblem { 42 42 43 43 #region Parameter Properties … … 60 60 get { return SolutionCreatorParameter; } 61 61 } 62 public new ValueParameter<SupportVector RegressionParameterAdjustmentEvaluator> EvaluatorParameter {63 get { return (ValueParameter<SupportVector RegressionParameterAdjustmentEvaluator>)Parameters["Evaluator"]; }62 public new ValueParameter<SupportVectorMachineParameterAdjustmentEvaluator> EvaluatorParameter { 63 get { return (ValueParameter<SupportVectorMachineParameterAdjustmentEvaluator>)Parameters["Evaluator"]; } 64 64 } 65 65 IParameter IProblem.EvaluatorParameter { … … 96 96 get { return SolutionCreatorParameter.Value; } 97 97 } 98 public new SupportVector RegressionParameterAdjustmentEvaluator Evaluator {98 public new SupportVectorMachineParameterAdjustmentEvaluator Evaluator { 99 99 get { return EvaluatorParameter.Value; } 100 100 set { EvaluatorParameter.Value = value; } … … 115 115 } 116 116 #endregion 117 118 119 //public int MinimumProblemSize {120 // get { return 3; }121 //}122 //public int MaximumProblemSize {123 // get { return 3; }124 //}125 117 126 118 public IntValue TrainingSamplesStart { … … 139 131 140 132 [StorableConstructor] 141 private SupportVector RegressionParameterAdjustmentProblem(bool deserializing) : base() { }142 public SupportVector RegressionParameterAdjustmentProblem()133 private SupportVectorMachineParameterAdjustmentProblem(bool deserializing) : base() { } 134 public SupportVectorMachineParameterAdjustmentProblem() 143 135 : base() { 144 136 UniformRandomRealVectorCreator creator = new UniformRandomRealVectorCreator(); 145 SupportVector RegressionParameterAdjustmentEvaluator evaluator = new SupportVectorRegressionParameterAdjustmentEvaluator();137 SupportVectorMachineParameterAdjustmentEvaluator evaluator = new SupportVectorMachineParameterAdjustmentEvaluator(); 146 138 147 139 var bounds = new DoubleMatrix(new double[,] { … … 155 147 Parameters.Add(new ValueParameter<IntValue>("ProblemSize", "The dimension of the problem.", new IntValue(3))); 156 148 Parameters.Add(new ValueParameter<IRealVectorCreator>("SolutionCreator", "The operator which should be used to create new test function solutions.", creator)); 157 Parameters.Add(new ValueParameter<SupportVector RegressionParameterAdjustmentEvaluator>("Evaluator", "The operator which should be used to evaluate test function solutions.", evaluator));149 Parameters.Add(new ValueParameter<SupportVectorMachineParameterAdjustmentEvaluator>("Evaluator", "The operator which should be used to evaluate test function solutions.", evaluator)); 158 150 Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this test function.", new DoubleValue(0))); 159 151 Parameters.Add(new OptionalValueParameter<RealVector>("BestKnownSolution", "The best known solution for this test function instance.")); … … 169 161 ParameterizeSolutionCreator(); 170 162 ParameterizeEvaluator(); 163 ParameterizeAnalyzers(); 171 164 172 165 Initialize(); … … 175 168 176 169 public override IDeepCloneable Clone(Cloner cloner) { 177 SupportVector RegressionParameterAdjustmentProblem clone = (SupportVectorRegressionParameterAdjustmentProblem)base.Clone(cloner);170 SupportVectorMachineParameterAdjustmentProblem clone = (SupportVectorMachineParameterAdjustmentProblem)base.Clone(cloner); 178 171 clone.strategyVectorCreator = (StdDevStrategyVectorCreator)cloner.Clone(strategyVectorCreator); 179 172 clone.strategyVectorCrossover = (StdDevStrategyVectorCrossover)cloner.Clone(strategyVectorCrossover); … … 191 184 private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) { 192 185 ParameterizeSolutionCreator(); 193 //ParameterizeAnalyzers();186 ParameterizeAnalyzers(); 194 187 SolutionCreator_RealVectorParameter_ActualNameChanged(null, EventArgs.Empty); 195 188 } … … 197 190 ParameterizeEvaluator(); 198 191 ParameterizeOperators(); 199 //ParameterizeAnalyzers();192 ParameterizeAnalyzers(); 200 193 } 201 194 private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) { 202 195 ParameterizeEvaluator(); 203 //ParameterizeAnalyzers();196 ParameterizeAnalyzers(); 204 197 RaiseReset(EventArgs.Empty); 205 198 } … … 224 217 operators = new List<IOperator>(); 225 218 operators.AddRange(ApplicationManager.Manager.GetInstances<IRealVectorOperator>().Cast<IOperator>()); 219 operators.Add(new SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer()); 226 220 operators.Add(strategyVectorCreator); 227 221 operators.Add(strategyVectorCrossover); … … 254 248 op.BoundsParameter.ActualName = BoundsParameter.Name; 255 249 } 256 foreach (SupportVector RegressionParameterAdjustmentEvaluator op in Operators.OfType<SupportVectorRegressionParameterAdjustmentEvaluator>()) {250 foreach (SupportVectorMachineParameterAdjustmentEvaluator op in Operators.OfType<SupportVectorMachineParameterAdjustmentEvaluator>()) { 257 251 op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName; 258 252 op.ParameterVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName; -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineCrossValidationEvaluator.cs
r3877 r3884 41 41 [Item("SupportVectorMachineCrossValidationEvaluator", "Represents an operator that performs SVM cross validation with the given parameters.")] 42 42 public class SupportVectorMachineCrossValidationEvaluator : SingleSuccessorOperator, ISingleObjectiveEvaluator { 43 private const string RandomParameterName = "Random"; 43 44 private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData"; 44 45 private const string SvmTypeParameterName = "SvmType"; … … 50 51 private const string SamplesStartParameterName = "SamplesStart"; 51 52 private const string SamplesEndParameterName = "SamplesEnd"; 53 private const string ActualSamplesParameterName = "ActualSamples"; 52 54 private const string NumberOfFoldsParameterName = "NumberOfFolds"; 53 55 private const string QualityParameterName = "Quality"; 54 56 55 57 #region parameter properties 58 public ILookupParameter<IRandom> RandomParameter { 59 get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; } 60 } 56 61 public IValueLookupParameter<DataAnalysisProblemData> DataAnalysisProblemDataParameter { 57 62 get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[DataAnalysisProblemDataParameterName]; } … … 80 85 public IValueLookupParameter<IntValue> SamplesEndParameter { 81 86 get { return (IValueLookupParameter<IntValue>)Parameters[SamplesEndParameterName]; } 87 } 88 public IValueLookupParameter<PercentValue> ActualSamplesParameter { 89 get { return (IValueLookupParameter<PercentValue>)Parameters[ActualSamplesParameterName]; } 82 90 } 83 91 public IValueLookupParameter<IntValue> NumberOfFoldsParameter { … … 123 131 public SupportVectorMachineCrossValidationEvaluator() 124 132 : base() { 133 Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator to use.")); 125 134 Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(DataAnalysisProblemDataParameterName, "The data analysis problem data to use for training.")); 126 135 Parameters.Add(new ValueLookupParameter<StringValue>(SvmTypeParameterName, "The type of SVM to use.")); … … 132 141 Parameters.Add(new ValueLookupParameter<IntValue>(SamplesStartParameterName, "The first index of the data set partition the support vector machine should use for training.")); 133 142 Parameters.Add(new ValueLookupParameter<IntValue>(SamplesEndParameterName, "The last index of the data set partition the support vector machine should use for training.")); 143 Parameters.Add(new ValueLookupParameter<PercentValue>(ActualSamplesParameterName, "The percentage of the training set that should be acutally used for cross-validation (samples are picked randomly from the training set).")); 134 144 Parameters.Add(new ValueLookupParameter<IntValue>(NumberOfFoldsParameterName, "The number of folds to use for cross-validation.")); 135 145 Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The cross validation quality reached with the given parameters.")); … … 137 147 138 148 public override IOperation Apply() { 139 double quality = PerformCrossValidation(DataAnalysisProblemData, 140 SamplesStart.Value, SamplesEnd.Value, 149 double reductionRatio = 1.0; 150 if (ActualSamplesParameter.ActualValue != null) 151 reductionRatio = ActualSamplesParameter.ActualValue.Value; 152 153 int reducedRows = (int)((SamplesEnd.Value - SamplesStart.Value) * reductionRatio); 154 var reducedProblemData = (DataAnalysisProblemData)DataAnalysisProblemData.Clone(); 155 ShuffleRows(RandomParameter.ActualValue, reducedProblemData.Dataset, SamplesStart.Value, SamplesEnd.Value); 156 157 double quality = PerformCrossValidation(reducedProblemData, 158 SamplesStart.Value, SamplesStart.Value + reducedRows, 141 159 SvmType.Value, KernelType.Value, 142 160 Cost.Value, Nu.Value, Gamma.Value, Epsilon.Value, NumberOfFolds.Value); … … 144 162 QualityParameter.ActualValue = new DoubleValue(quality); 145 163 return base.Apply(); 164 } 165 166 private void ShuffleRows(IRandom random, Dataset dataset, int start, int end) { 167 for (int row = end - 1; row > start ; row--) { 168 int otherRow = random.Next(start, row); 169 for (int column = 0; column < dataset.Columns; column++) { 170 double tmp = dataset[otherRow, column]; 171 dataset[otherRow, column] = dataset[row, column]; 172 dataset[row, column] = tmp; 173 } 174 } 146 175 } 147 176 … … 178 207 SVM.Problem scaledProblem = Scaling.Scale(rangeTransform, problem); 179 208 180 return SVM.Training.PerformCrossValidation(scaledProblem, parameter, nFolds );209 return SVM.Training.PerformCrossValidation(scaledProblem, parameter, nFolds, false); 181 210 } 182 211 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModel.cs
r3853 r3884 29 29 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 30 30 using HeuristicLab.Common; 31 using SVM; 32 using System.Linq; 31 33 32 34 namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine { … … 36 38 [StorableClass] 37 39 [Item("SupportVectorMachineModel", "Represents a support vector machine model.")] 38 public class SupportVectorMachineModel : NamedItem { 40 public class SupportVectorMachineModel : NamedItem, IDataAnalysisModel { 41 public SupportVectorMachineModel() 42 : base() { 43 } 44 39 45 private SVM.Model model; 40 46 /// <summary> … … 67 73 } 68 74 69 public SupportVectorMachineModel() 70 : base() { 75 public IEnumerable<double> GetEstimatedValues(DataAnalysisProblemData problemData, int start, int end) { 76 SVM.Problem problem = SupportVectorMachineUtil.CreateSvmProblem(problemData, start, end); 77 SVM.Problem scaledProblem = Scaling.Scale(RangeTransform, problem); 78 79 return (from row in Enumerable.Range(0, scaledProblem.Count) 80 select SVM.Prediction.Predict(Model, scaledProblem.X[row])).ToList(); 71 81 } 72 82 … … 81 91 82 92 #region persistence 93 [Storable] 94 private int[] SupportVectorIndizes { 95 get { return this.Model.SupportVectorIndizes; } 96 set { this.Model.SupportVectorIndizes = value; } 97 } 98 83 99 [Storable] 84 100 private string ModelAsString { … … 131 147 StreamWriter writer = new StreamWriter(s); 132 148 writer.WriteLine("RangeTransform:"); 133 writer.Flush(); 149 writer.Flush(); 134 150 using (MemoryStream memStream = new MemoryStream()) { 135 151 SVM.RangeTransform.Write(memStream, model.RangeTransform);
Note: See TracChangeset
for help on using the changeset viewer.