Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/01/10 17:58:03 (14 years ago)
Author:
gkronber
Message:

Worked on support vector regression operators and views. #1009

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  
    7171
    7272    #region events
    73     protected virtual void OnDataAnalysisProblemChanged(EventArgs e) { }
     73    protected virtual void OnDataAnalysisProblemChanged(EventArgs e) {
     74      RaiseReset(e);
     75    }
    7476
    7577    private void RegisterParameterEvents() {
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/DataAnalysisSolution.cs

    r3710 r3884  
    3636  [StorableClass]
    3737  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
    3856    [Storable]
    3957    private DataAnalysisProblemData problemData;
     
    4361        if (problemData != value) {
    4462          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
    4567          if (problemData != null) DeregisterProblemDataEvents();
    4668          problemData = value;
    4769          RegisterProblemDataEvents();
    48           OnProblemDataChanged(EventArgs.Empty);
     70          OnProblemDataChanged();
    4971        }
    5072      }
    5173    }
     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
    5288    [Storable]
    5389    private double lowerEstimationLimit;
     
    5793        if (lowerEstimationLimit != value) {
    5894          lowerEstimationLimit = value;
    59           OnEstimatedValuesChanged(EventArgs.Empty);
     95          RecalculateEstimatedValues();
    6096        }
    6197      }
     
    69105        if (upperEstimationLimit != value) {
    70106          upperEstimationLimit = value;
    71           OnEstimatedValuesChanged(EventArgs.Empty);
     107          RecalculateEstimatedValues();
    72108        }
    73109      }
     
    77113    public abstract IEnumerable<double> EstimatedTrainingValues { get; }
    78114    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();
    110116
    111117    #region Events
     
    116122      ProblemData.ProblemDataChanged += new EventHandler(ProblemData_Changed);
    117123    }
    118 
    119124    private void ProblemData_Changed(object sender, EventArgs e) {
    120       OnProblemDataChanged(EventArgs.Empty);
     125      OnProblemDataChanged();
    121126    }
    122127
    123128    public event EventHandler ProblemDataChanged;
    124     protected virtual void OnProblemDataChanged(EventArgs e) {
     129    protected virtual void OnProblemDataChanged() {
     130      RecalculateEstimatedValues();
    125131      var listeners = ProblemDataChanged;
    126132      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);
    128142    }
    129143
    130144    public event EventHandler EstimatedValuesChanged;
    131     protected virtual void OnEstimatedValuesChanged(EventArgs e) {
     145    protected virtual void OnEstimatedValuesChanged() {
    132146      var listeners = EstimatedValuesChanged;
    133147      if (listeners != null)
    134         listeners(this, e);
     148        listeners(this, EventArgs.Empty);
    135149    }
    136150    #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    }
    137162  }
    138163}
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj

    r3877 r3884  
    9898    <Compile Include="Evaluators\SimpleVarianceAccountedForEvaluator.cs" />
    9999    <Compile Include="HeuristicLabProblemsDataAnalysisPlugin.cs" />
     100    <Compile Include="Interfaces\IDataAnalysisModel.cs" />
    100101    <Compile Include="Interfaces\IDataAnalysisProblem.cs" />
    101102    <Compile Include="MatrixExtensions.cs" />
    102103    <Compile Include="Properties\AssemblyInfo.cs" />
     104    <Compile Include="SupportVectorMachine\ParameterAdjustmentProblem\SupportVectorRegressionParameterAdjustmentBestSolutionAnalyzer.cs" />
    103105    <Compile Include="SupportVectorMachine\ParameterAdjustmentProblem\SupportVectorRegressionParameterAdjustmentEvaluator.cs" />
    104106    <Compile Include="SupportVectorMachine\ParameterAdjustmentProblem\SupportVectorRegressionParameterAdjustmentProblem.cs" />
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentEvaluator.cs

    r3883 r3884  
    3434
    3535namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine.ParameterAdjustmentProblem {
    36   [Item("SupportVectorRegressionParameterAdjustmentEvaluator", "")]
     36  [Item("SupportVectorMachineParameterAdjustmentEvaluator", "")]
    3737  [StorableClass]
    38   public class SupportVectorRegressionParameterAdjustmentEvaluator : AlgorithmOperator, ISingleObjectiveEvaluator {
     38  public class SupportVectorMachineParameterAdjustmentEvaluator : AlgorithmOperator, ISingleObjectiveEvaluator {
    3939    private const string ParameterVectorParameterName = "ParameterVector";
    4040    private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData";
     
    112112    #endregion
    113113
    114     public SupportVectorRegressionParameterAdjustmentEvaluator()
     114    public SupportVectorMachineParameterAdjustmentEvaluator()
    115115      : base() {
    116116      StringValue nuSvrType = new StringValue("NU_SVR").AsReadOnly();
     
    141141      GammaParameter.Value = new DoubleValue(Math.Pow(2, point[2]));
    142142      EpsilonParameter.Value = new DoubleValue();
    143 
    144143      return base.Apply();
    145144    }
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/ParameterAdjustmentProblem/SupportVectorMachineParameterAdjustmentProblem.cs

    r3883 r3884  
    3636
    3737namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine.ParameterAdjustmentProblem {
    38   [Item("Support Vector Regression Parameter 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.")]
    3939  [StorableClass]
    4040  [Creatable("Problems")]
    41   public sealed class SupportVectorRegressionParameterAdjustmentProblem : DataAnalysisProblem, ISingleObjectiveProblem {
     41  public sealed class SupportVectorMachineParameterAdjustmentProblem : DataAnalysisProblem, ISingleObjectiveProblem {
    4242
    4343    #region Parameter Properties
     
    6060      get { return SolutionCreatorParameter; }
    6161    }
    62     public new ValueParameter<SupportVectorRegressionParameterAdjustmentEvaluator> EvaluatorParameter {
    63       get { return (ValueParameter<SupportVectorRegressionParameterAdjustmentEvaluator>)Parameters["Evaluator"]; }
     62    public new ValueParameter<SupportVectorMachineParameterAdjustmentEvaluator> EvaluatorParameter {
     63      get { return (ValueParameter<SupportVectorMachineParameterAdjustmentEvaluator>)Parameters["Evaluator"]; }
    6464    }
    6565    IParameter IProblem.EvaluatorParameter {
     
    9696      get { return SolutionCreatorParameter.Value; }
    9797    }
    98     public new SupportVectorRegressionParameterAdjustmentEvaluator Evaluator {
     98    public new SupportVectorMachineParameterAdjustmentEvaluator Evaluator {
    9999      get { return EvaluatorParameter.Value; }
    100100      set { EvaluatorParameter.Value = value; }
     
    115115    }
    116116    #endregion
    117 
    118 
    119     //public int MinimumProblemSize {
    120     //  get { return 3; }
    121     //}
    122     //public int MaximumProblemSize {
    123     //  get { return 3; }
    124     //}
    125117
    126118    public IntValue TrainingSamplesStart {
     
    139131
    140132    [StorableConstructor]
    141     private SupportVectorRegressionParameterAdjustmentProblem(bool deserializing) : base() { }
    142     public SupportVectorRegressionParameterAdjustmentProblem()
     133    private SupportVectorMachineParameterAdjustmentProblem(bool deserializing) : base() { }
     134    public SupportVectorMachineParameterAdjustmentProblem()
    143135      : base() {
    144136      UniformRandomRealVectorCreator creator = new UniformRandomRealVectorCreator();
    145       SupportVectorRegressionParameterAdjustmentEvaluator evaluator = new SupportVectorRegressionParameterAdjustmentEvaluator();
     137      SupportVectorMachineParameterAdjustmentEvaluator evaluator = new SupportVectorMachineParameterAdjustmentEvaluator();
    146138
    147139      var bounds = new DoubleMatrix(new double[,] {
     
    155147      Parameters.Add(new ValueParameter<IntValue>("ProblemSize", "The dimension of the problem.", new IntValue(3)));
    156148      Parameters.Add(new ValueParameter<IRealVectorCreator>("SolutionCreator", "The operator which should be used to create new test function solutions.", creator));
    157       Parameters.Add(new ValueParameter<SupportVectorRegressionParameterAdjustmentEvaluator>("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));
    158150      Parameters.Add(new OptionalValueParameter<DoubleValue>("BestKnownQuality", "The quality of the best known solution of this test function.", new DoubleValue(0)));
    159151      Parameters.Add(new OptionalValueParameter<RealVector>("BestKnownSolution", "The best known solution for this test function instance."));
     
    169161      ParameterizeSolutionCreator();
    170162      ParameterizeEvaluator();
     163      ParameterizeAnalyzers();
    171164
    172165      Initialize();
     
    175168
    176169    public override IDeepCloneable Clone(Cloner cloner) {
    177       SupportVectorRegressionParameterAdjustmentProblem clone = (SupportVectorRegressionParameterAdjustmentProblem)base.Clone(cloner);
     170      SupportVectorMachineParameterAdjustmentProblem clone = (SupportVectorMachineParameterAdjustmentProblem)base.Clone(cloner);
    178171      clone.strategyVectorCreator = (StdDevStrategyVectorCreator)cloner.Clone(strategyVectorCreator);
    179172      clone.strategyVectorCrossover = (StdDevStrategyVectorCrossover)cloner.Clone(strategyVectorCrossover);
     
    191184    private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
    192185      ParameterizeSolutionCreator();
    193       //ParameterizeAnalyzers();
     186      ParameterizeAnalyzers();
    194187      SolutionCreator_RealVectorParameter_ActualNameChanged(null, EventArgs.Empty);
    195188    }
     
    197190      ParameterizeEvaluator();
    198191      ParameterizeOperators();
    199       //ParameterizeAnalyzers();
     192      ParameterizeAnalyzers();
    200193    }
    201194    private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
    202195      ParameterizeEvaluator();
    203       //ParameterizeAnalyzers();
     196      ParameterizeAnalyzers();
    204197      RaiseReset(EventArgs.Empty);
    205198    }
     
    224217      operators = new List<IOperator>();
    225218      operators.AddRange(ApplicationManager.Manager.GetInstances<IRealVectorOperator>().Cast<IOperator>());
     219      operators.Add(new SupportVectorMachineParameterAdjustmentBestSolutionAnalyzer());
    226220      operators.Add(strategyVectorCreator);
    227221      operators.Add(strategyVectorCrossover);
     
    254248        op.BoundsParameter.ActualName = BoundsParameter.Name;
    255249      }
    256       foreach (SupportVectorRegressionParameterAdjustmentEvaluator op in Operators.OfType<SupportVectorRegressionParameterAdjustmentEvaluator>()) {
     250      foreach (SupportVectorMachineParameterAdjustmentEvaluator op in Operators.OfType<SupportVectorMachineParameterAdjustmentEvaluator>()) {
    257251        op.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;
    258252        op.ParameterVectorParameter.ActualName = SolutionCreator.RealVectorParameter.ActualName;
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineCrossValidationEvaluator.cs

    r3877 r3884  
    4141  [Item("SupportVectorMachineCrossValidationEvaluator", "Represents an operator that performs SVM cross validation with the given parameters.")]
    4242  public class SupportVectorMachineCrossValidationEvaluator : SingleSuccessorOperator, ISingleObjectiveEvaluator {
     43    private const string RandomParameterName = "Random";
    4344    private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData";
    4445    private const string SvmTypeParameterName = "SvmType";
     
    5051    private const string SamplesStartParameterName = "SamplesStart";
    5152    private const string SamplesEndParameterName = "SamplesEnd";
     53    private const string ActualSamplesParameterName = "ActualSamples";
    5254    private const string NumberOfFoldsParameterName = "NumberOfFolds";
    5355    private const string QualityParameterName = "Quality";
    5456
    5557    #region parameter properties
     58    public ILookupParameter<IRandom> RandomParameter {
     59      get { return (ILookupParameter<IRandom>)Parameters[RandomParameterName]; }
     60    }
    5661    public IValueLookupParameter<DataAnalysisProblemData> DataAnalysisProblemDataParameter {
    5762      get { return (IValueLookupParameter<DataAnalysisProblemData>)Parameters[DataAnalysisProblemDataParameterName]; }
     
    8085    public IValueLookupParameter<IntValue> SamplesEndParameter {
    8186      get { return (IValueLookupParameter<IntValue>)Parameters[SamplesEndParameterName]; }
     87    }
     88    public IValueLookupParameter<PercentValue> ActualSamplesParameter {
     89      get { return (IValueLookupParameter<PercentValue>)Parameters[ActualSamplesParameterName]; }
    8290    }
    8391    public IValueLookupParameter<IntValue> NumberOfFoldsParameter {
     
    123131    public SupportVectorMachineCrossValidationEvaluator()
    124132      : base() {
     133      Parameters.Add(new LookupParameter<IRandom>(RandomParameterName, "The random generator to use."));
    125134      Parameters.Add(new ValueLookupParameter<DataAnalysisProblemData>(DataAnalysisProblemDataParameterName, "The data analysis problem data to use for training."));
    126135      Parameters.Add(new ValueLookupParameter<StringValue>(SvmTypeParameterName, "The type of SVM to use."));
     
    132141      Parameters.Add(new ValueLookupParameter<IntValue>(SamplesStartParameterName, "The first index of the data set partition the support vector machine should use for training."));
    133142      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)."));
    134144      Parameters.Add(new ValueLookupParameter<IntValue>(NumberOfFoldsParameterName, "The number of folds to use for cross-validation."));
    135145      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The cross validation quality reached with the given parameters."));
     
    137147
    138148    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,
    141159                             SvmType.Value, KernelType.Value,
    142160                             Cost.Value, Nu.Value, Gamma.Value, Epsilon.Value, NumberOfFolds.Value);
     
    144162      QualityParameter.ActualValue = new DoubleValue(quality);
    145163      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      }
    146175    }
    147176
     
    178207      SVM.Problem scaledProblem = Scaling.Scale(rangeTransform, problem);
    179208
    180       return SVM.Training.PerformCrossValidation(scaledProblem, parameter, nFolds);
     209      return SVM.Training.PerformCrossValidation(scaledProblem, parameter, nFolds, false);
    181210    }
    182211  }
  • trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/SupportVectorMachine/SupportVectorMachineModel.cs

    r3853 r3884  
    2929using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3030using HeuristicLab.Common;
     31using SVM;
     32using System.Linq;
    3133
    3234namespace HeuristicLab.Problems.DataAnalysis.SupportVectorMachine {
     
    3638  [StorableClass]
    3739  [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
    3945    private SVM.Model model;
    4046    /// <summary>
     
    6773    }
    6874
    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();
    7181    }
    7282
     
    8191
    8292    #region persistence
     93    [Storable]
     94    private int[] SupportVectorIndizes {
     95      get { return this.Model.SupportVectorIndizes; }
     96      set { this.Model.SupportVectorIndizes = value; }
     97    }
     98
    8399    [Storable]
    84100    private string ModelAsString {
     
    131147      StreamWriter writer = new StreamWriter(s);
    132148      writer.WriteLine("RangeTransform:");
    133       writer.Flush(); 
     149      writer.Flush();
    134150      using (MemoryStream memStream = new MemoryStream()) {
    135151        SVM.RangeTransform.Write(memStream, model.RangeTransform);
Note: See TracChangeset for help on using the changeset viewer.