Free cookie consent management tool by TermsFeed Policy Generator

Changeset 2360


Ignore:
Timestamp:
09/15/09 16:35:54 (15 years ago)
Author:
gkronber
Message:

Implemented #706 (Linear regression algorithm for time series).

Location:
trunk/sources/HeuristicLab.LinearRegression/3.2
Files:
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.LinearRegression/3.2/HeuristicLab.LinearRegression-3.2.csproj

    r2353 r2360  
    9595    <Compile Include="LinearRegression.cs" />
    9696    <Compile Include="LinearRegressionOperator.cs" />
     97    <Compile Include="LinearTimeSeriesPrognosis.cs" />
    9798    <Compile Include="Properties\AssemblyInfo.cs" />
    9899  </ItemGroup>
  • trunk/sources/HeuristicLab.LinearRegression/3.2/LinearRegression.cs

    r2356 r2360  
    6060      get {
    6161        IOperator main = GetMainOperator();
    62         return main.SubOperators[1];
     62        return main.SubOperators[2];
    6363      }
    6464      set {
    6565        IOperator main = GetMainOperator();
    66         main.RemoveSubOperator(1);
    67         main.AddSubOperator(value, 1);
     66        main.RemoveSubOperator(2);
     67        main.AddSubOperator(value, 2);
    6868      }
    6969    }
     
    197197    }
    198198
     199    protected virtual IOperator GetVariableInjector() {
     200      return GetMainOperator().SubOperators[0];
     201    }
     202
    199203    public override IView CreateView() {
    200204      return engine.CreateView();
  • trunk/sources/HeuristicLab.LinearRegression/3.2/LinearRegressionOperator.cs

    r2324 r2360  
    4141      AddVariableInfo(new VariableInfo("SamplesStart", "Start index of samples in dataset to evaluate", typeof(IntData), VariableKind.In));
    4242      AddVariableInfo(new VariableInfo("SamplesEnd", "End index of samples in dataset to evaluate", typeof(IntData), VariableKind.In));
     43      AddVariableInfo(new VariableInfo("MaxTimeOffset", "(optional) Maximal time offset for time-series prognosis", typeof(IntData), VariableKind.In));
     44      AddVariableInfo(new VariableInfo("MinTimeOffset", "(optional) Minimal time offset for time-series prognosis", typeof(IntData), VariableKind.In));
    4345      AddVariableInfo(new VariableInfo("LinearRegressionModel", "Formula that was calculated by linear regression", typeof(IGeneticProgrammingModel), VariableKind.Out | VariableKind.New));
    4446    }
     
    4951      int start = GetVariableValue<IntData>("SamplesStart", scope, true).Data;
    5052      int end = GetVariableValue<IntData>("SamplesEnd", scope, true).Data;
    51       List<int> allowedRows = CalculateAllowedRows(dataset, targetVariable, start, end);
     53      IntData maxTimeOffsetData = GetVariableValue<IntData>("MaxTimeOffset", scope, true, false);
     54      int maxTimeOffset = maxTimeOffsetData == null ? 0 : maxTimeOffsetData.Data;
     55      IntData minTimeOffsetData = GetVariableValue<IntData>("MinTimeOffset", scope, true, false);
     56      int minTimeOffset = minTimeOffsetData == null ? 0 : minTimeOffsetData.Data;
     57
     58      List<int> allowedRows = CalculateAllowedRows(dataset, targetVariable, start, end, minTimeOffset, maxTimeOffset);
    5259      List<int> allowedColumns = CalculateAllowedColumns(dataset, targetVariable, start, end);
    5360
    54       double[,] inputMatrix = PrepareInputMatrix(dataset, allowedColumns, allowedRows);
     61      double[,] inputMatrix = PrepareInputMatrix(dataset, allowedColumns, allowedRows, minTimeOffset, maxTimeOffset);
    5562      double[] targetVector = PrepareTargetVector(dataset, targetVariable, allowedRows);
    5663      double[] coefficients = CalculateCoefficients(inputMatrix, targetVector);
    57       IFunctionTree tree = CreateModel(coefficients, allowedColumns.Select(i => dataset.GetVariableName(i)).ToList());
     64      IFunctionTree tree = CreateModel(coefficients, allowedColumns.Select(i => dataset.GetVariableName(i)).ToList(), minTimeOffset, maxTimeOffset);
    5865
    5966      scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName("LinearRegressionModel"), new GeneticProgrammingModel(tree)));
     
    6168    }
    6269
    63     private IFunctionTree CreateModel(double[] coefficients, List<string> allowedVariables) {
     70    private IFunctionTree CreateModel(double[] coefficients, List<string> allowedVariables, int minTimeOffset, int maxTimeOffset) {
    6471      IFunctionTree root = new Addition().GetTreeNode();
    6572      IFunctionTree actNode = root;
     73      int timeOffsetRange = (maxTimeOffset - minTimeOffset + 1);
    6674
    6775      Queue<IFunctionTree> nodes = new Queue<IFunctionTree>();
    68       GP.StructureIdentification.Variable v;
    69       for (int i = 0; i < coefficients.Length - 1; i++) {
    70         var vNode = (VariableFunctionTree)new GP.StructureIdentification.Variable().GetTreeNode();
    71         vNode.VariableName = allowedVariables[i];
    72         vNode.Weight = coefficients[i];
    73         vNode.SampleOffset = 0;
    74         nodes.Enqueue(vNode);
     76      for (int i = 0; i < allowedVariables.Count; i++) {
     77        for (int timeOffset = minTimeOffset; timeOffset <= maxTimeOffset; timeOffset++) {
     78          var vNode = (VariableFunctionTree)new GP.StructureIdentification.Variable().GetTreeNode();
     79          vNode.VariableName = allowedVariables[i];
     80          vNode.Weight = coefficients[(i * timeOffsetRange) + (timeOffset - minTimeOffset)];
     81          vNode.SampleOffset = timeOffset;
     82          nodes.Enqueue(vNode);
     83        }
    7584      }
    7685      var cNode = (ConstantFunctionTree)new Constant().GetTreeNode();
     
    101110
    102111    //returns list of valid row indexes (rows without NaN values)
    103     private List<int> CalculateAllowedRows(Dataset dataset, int targetVariable, int start, int end) {
     112    private List<int> CalculateAllowedRows(Dataset dataset, int targetVariable, int start, int end, int minTimeOffset, int maxTimeOffset) {
    104113      List<int> allowedRows = new List<int>();
    105114      bool add;
     
    107116        add = true;
    108117        for (int col = 0; col < dataset.Columns && add == true; col++) {
    109           if (double.IsNaN(dataset.GetValue(row, col)) ||
    110               double.IsNaN(dataset.GetValue(row, targetVariable)))
    111             add = false;
     118          for (int timeOffset = minTimeOffset; timeOffset <= maxTimeOffset; timeOffset++) {
     119            if (
     120              row + timeOffset < 0 ||
     121              row + timeOffset > dataset.Rows ||
     122              double.IsNaN(dataset.GetValue(row + timeOffset, col)) ||
     123              double.IsNaN(dataset.GetValue(row + timeOffset, targetVariable))) {
     124              add = false;
     125            }
     126          }
    112127        }
    113128        if (add)
     
    130145    }
    131146
    132     private double[,] PrepareInputMatrix(Dataset dataset, List<int> allowedColumns, List<int> allowedRows) {
     147    private double[,] PrepareInputMatrix(Dataset dataset, List<int> allowedColumns, List<int> allowedRows, int minTimeOffset, int maxTimeOffset) {
    133148      int rowCount = allowedRows.Count;
    134       double[,] matrix = new double[rowCount, allowedColumns.Count + 1];
    135       for (int col = 0; col < allowedColumns.Count; col++) {
    136         for (int row = 0; row < allowedRows.Count; row++)
    137           matrix[row, col] = dataset.GetValue(allowedRows[row], allowedColumns[col]);
    138       }
     149      int timeOffsetRange = (maxTimeOffset - minTimeOffset + 1);
     150      double[,] matrix = new double[rowCount, (allowedColumns.Count * timeOffsetRange) + 1];
     151      for (int row = 0; row < allowedRows.Count; row++)
     152        for (int col = 0; col < allowedColumns.Count; col++) {
     153          for (int timeOffset = minTimeOffset; timeOffset <= maxTimeOffset; timeOffset++)
     154            matrix[row, (col * timeOffsetRange) + (timeOffset - minTimeOffset)] = dataset.GetValue(allowedRows[row] + timeOffset, allowedColumns[col]);
     155        }
    139156      //add constant 1.0 in last column
    140157      for (int i = 0; i < rowCount; i++)
    141         matrix[i, allowedColumns.Count] = constant;
     158        matrix[i, allowedColumns.Count * timeOffsetRange] = constant;
    142159      return matrix;
    143160    }
  • trunk/sources/HeuristicLab.LinearRegression/3.2/LinearTimeSeriesPrognosis.cs

    r2356 r2360  
    3838
    3939namespace HeuristicLab.LinearRegression {
    40   public class LinearClassification : LinearRegression, IClassificationAlgorithm {
     40  public class LinearTimeSeriesPrognosis : LinearRegression, ITimeSeriesAlgorithm {
    4141
    42     public override string Name { get { return "LinearClassification"; } }
     42    public override string Name { get { return "LinearTimeSeriesPrognosis"; } }
     43    public int MaxTimeOffset {
     44      get { return GetVariableInjector().GetVariable("MaxTimeOffset").GetValue<IntData>().Data; }
     45      set { GetVariableInjector().GetVariable("MaxTimeOffset").GetValue<IntData>().Data = value; }
     46    }
    4347
    44     public LinearClassification()
     48    public int MinTimeOffset {
     49      get { return GetVariableInjector().GetVariable("MinTimeOffset").GetValue<IntData>().Data; }
     50      set { GetVariableInjector().GetVariable("MinTimeOffset").GetValue<IntData>().Data = value; }
     51    }
     52
     53
     54    public LinearTimeSeriesPrognosis()
    4555      : base() {
     56      MaxTimeOffset = -1;
     57      MinTimeOffset = -1;
    4658    }
    4759
    4860    protected override IOperator CreateProblemInjector() {
    49       return DefaultClassificationOperators.CreateProblemInjector();
     61      return DefaultTimeSeriesOperators.CreateProblemInjector();
     62    }
     63
     64    protected override VariableInjector CreateGlobalInjector() {
     65      VariableInjector injector = base.CreateGlobalInjector();
     66      injector.AddVariable(new HeuristicLab.Core.Variable("MinTimeOffset", new IntData()));
     67      injector.AddVariable(new HeuristicLab.Core.Variable("MaxTimeOffset", new IntData()));
     68      return injector;
    5069    }
    5170
    5271    protected override IOperator CreateModelAnalyzerOperator() {
    53       return DefaultClassificationOperators.CreatePostProcessingOperator();
     72      return DefaultTimeSeriesOperators.CreatePostProcessingOperator();
    5473    }
    5574
    5675    protected internal virtual IAnalyzerModel CreateLRModel(IScope bestModelScope) {
    5776      var model = new AnalyzerModel();
    58       DefaultClassificationOperators.PopulateAnalyzerModel(bestModelScope, model);
     77      DefaultTimeSeriesOperators.PopulateAnalyzerModel(bestModelScope, model);
    5978      return model;
    6079    }
Note: See TracChangeset for help on using the changeset viewer.