Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/14/12 17:35:07 (12 years ago)
Author:
sforsten
Message:

#1292:

  • added TimeframeFeatureCorrelationView
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/DatasetFeatureCorrelation/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation.cs

    r8483 r8492  
    9898    }
    9999
     100    public void CalculateTimeframeElements(string calc, string partition, string variable, int frames) {
     101      CalculateElements(problemData.Dataset, calc, partition, variable, frames);
     102    }
     103
    100104    private void CalculateElements(Dataset dataset) {
    101105      CalculateElements(dataset, CorrelationCalculators.First(), Partitions.First());
    102106    }
    103107
    104     private void CalculateElements(Dataset dataset, string calc, string partition) {
     108    private void CalculateElements(Dataset dataset, string calc, string partition, string variable = null, int frames = 0) {
    105109      if (bw == null || bw.IsBusy) {
    106110        if (bw != null) {
     
    110114        bw.WorkerReportsProgress = true;
    111115        bw.WorkerSupportsCancellation = true;
    112         bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    113         bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
    114         bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    115       }
    116       bw.RunWorkerAsync(new BackgroundWorkerInfo { Dataset = dataset, Calculator = calc, Partition = partition });
     116        bw.DoWork += new DoWorkEventHandler(BwDoWork);
     117        bw.ProgressChanged += new ProgressChangedEventHandler(BwProgressChanged);
     118        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BwRunWorkerCompleted);
     119      }
     120      bw.RunWorkerAsync(new BackgroundWorkerInfo { Dataset = dataset, Calculator = calc, Partition = partition, Variable = variable, Frames = frames });
    117121      if (calc.Equals(PearsonsR) || calc.Equals(SpearmansRank)) {
    118122        Maximum = 1.0;
     
    127131    }
    128132
    129     private void bw_DoWork(object sender, DoWorkEventArgs e) {
     133    #region backgroundworker
     134    private void BwDoWork(object sender, DoWorkEventArgs e) {
     135      BackgroundWorkerInfo bwInfo = (BackgroundWorkerInfo)e.Argument;
     136      if (bwInfo.Variable == null) {
     137        BwCalculateCorrelation(sender, e);
     138      } else {
     139        BwCalculateTimeframeCorrelation(sender, e);
     140      }
     141    }
     142
     143    private void BwCalculateCorrelation(object sender, DoWorkEventArgs e) {
    130144      BackgroundWorker worker = sender as BackgroundWorker;
    131145
     
    139153      int length = doubleVariableNames.Count;
    140154      double[,] elements = new double[length, length];
    141 
    142155      double calculations = (Math.Pow(length, 2) + length) / 2;
    143156
     
    151164          }
    152165
    153           IEnumerable<double> var1 = dataset.GetDoubleValues(doubleVariableNames[i]);
    154           IEnumerable<double> var2 = dataset.GetDoubleValues(doubleVariableNames[j]);
    155           if (partition.Equals(TrainingSamples)) {
    156             var1 = var1.Skip(problemData.TrainingPartition.Start).Take(problemData.TrainingPartition.End - problemData.TrainingPartition.Start);
    157             var2 = var2.Skip(problemData.TrainingPartition.Start).Take(problemData.TrainingPartition.End - problemData.TrainingPartition.Start);
    158           } else if (partition.Equals(TestSamples)) {
    159             var1 = var1.Skip(problemData.TestPartition.Start).Take(problemData.TestPartition.End - problemData.TestPartition.Start);
    160             var2 = var2.Skip(problemData.TestPartition.Start).Take(problemData.TestPartition.End - problemData.TestPartition.Start);
    161           }
    162 
    163           if (calc.Equals(HoeffdingsDependence)) {
    164             elements[i, j] = HoeffdingsDependenceCalculator.Calculate(var1, var2, out error);
    165           } else if (calc.Equals(SpearmansRank)) {
    166             elements[i, j] = SpearmansRankCorrelationCoefficientCalculator.Calculate(var1, var2, out error);
    167           } else if (calc.Equals(PearsonsRSquared)) {
    168             elements[i, j] = OnlinePearsonsRSquaredCalculator.Calculate(var1, var2, out error);
    169           } else {
    170             elements[i, j] = OnlinePearsonsRSquaredCalculator.CalculateR(var1, var2, out error);
    171           }
     166          IEnumerable<double> var1 = GetRelevantValues(problemData, partition, doubleVariableNames[i]);
     167          IEnumerable<double> var2 = GetRelevantValues(problemData, partition, doubleVariableNames[j]);
     168
     169          elements[i, j] = CalculateElementWithCalculator(calc, var1, var2, out error);
     170
    172171          elements[j, i] = elements[i, j];
    173172          if (!error.Equals(OnlineCalculatorError.None)) {
     
    181180    }
    182181
    183     private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
     182    private void BwCalculateTimeframeCorrelation(object sender, DoWorkEventArgs e) {
     183      BackgroundWorker worker = sender as BackgroundWorker;
     184
     185      BackgroundWorkerInfo bwInfo = (BackgroundWorkerInfo)e.Argument;
     186      Dataset dataset = bwInfo.Dataset;
     187      string partition = bwInfo.Partition;
     188      string calc = bwInfo.Calculator;
     189      string variable = bwInfo.Variable;
     190      int frames = bwInfo.Frames;
     191
     192      IList<string> doubleVariableNames = dataset.DoubleVariables.ToList();
     193      OnlineCalculatorError error;
     194      int length = doubleVariableNames.Count;
     195      double[,] elements = new double[length, frames + 1];
     196      double calculations = (frames + 1) * length;
     197
     198      worker.ReportProgress(0);
     199
     200      for (int i = 0; i < length; i++) {
     201        for (int j = 0; j <= frames; j++) {
     202          if (worker.CancellationPending) {
     203            e.Cancel = true;
     204            return;
     205          }
     206
     207          IEnumerable<double> var1 = GetRelevantValues(problemData, partition, variable);
     208          IEnumerable<double> var2 = GetRelevantValues(problemData, partition, doubleVariableNames[i]);
     209
     210          var valuesInFrame = var1.Take(j);
     211          var help = var1.Skip(j).ToList();
     212          help.AddRange(valuesInFrame);
     213          var1 = help;
     214
     215          elements[i, j] = CalculateElementWithCalculator(calc, var1, var2, out error);
     216
     217          if (!error.Equals(OnlineCalculatorError.None)) {
     218            worker.ReportProgress(100);
     219            throw new ArgumentException("Calculator returned " + error + Environment.NewLine + "Maybe try another calculator.");
     220          }
     221          worker.ReportProgress((int)((100.0 / calculations) * (i * (frames + 1) + j + 1)));
     222        }
     223      }
     224      e.Result = elements;
     225    }
     226
     227    private IEnumerable<double> GetRelevantValues(IDataAnalysisProblemData problemData, string partition, string variable) {
     228      IEnumerable<double> var = problemData.Dataset.GetDoubleValues(variable);
     229      if (partition.Equals(TrainingSamples)) {
     230        var = var.Skip(problemData.TrainingPartition.Start).Take(problemData.TrainingPartition.End - problemData.TrainingPartition.Start);
     231      } else if (partition.Equals(TestSamples)) {
     232        var = var.Skip(problemData.TestPartition.Start).Take(problemData.TestPartition.End - problemData.TestPartition.Start);
     233      }
     234      return var;
     235    }
     236
     237    private double CalculateElementWithCalculator(string calc, IEnumerable<double> var1, IEnumerable<double> var2, out OnlineCalculatorError error) {
     238      if (calc.Equals(HoeffdingsDependence)) {
     239        return HoeffdingsDependenceCalculator.Calculate(var1, var2, out error);
     240      } else if (calc.Equals(SpearmansRank)) {
     241        return SpearmansRankCorrelationCoefficientCalculator.Calculate(var1, var2, out error);
     242      } else if (calc.Equals(PearsonsRSquared)) {
     243        return OnlinePearsonsRSquaredCalculator.Calculate(var1, var2, out error);
     244      } else {
     245        return OnlinePearsonsRSquaredCalculator.CalculateR(var1, var2, out error);
     246      }
     247    }
     248
     249    private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
    184250      BackgroundWorker worker = sender as BackgroundWorker;
    185251      if (!e.Cancelled && !worker.CancellationPending) {
     
    188254        } else {
    189255          matrix = (double[,])e.Result;
    190           OnReset();
    191         }
    192       }
    193     }
     256          OnCorrelationCalculationFinished();
     257        }
     258      }
     259    }
     260    #endregion
    194261
    195262    #region events
     263    public event EventHandler CorrelationCalculationFinished;
     264    protected virtual void OnCorrelationCalculationFinished() {
     265      EventHandler handler = CorrelationCalculationFinished;
     266      if (handler != null)
     267        handler(this, EventArgs.Empty);
     268    }
     269
    196270    public delegate void ProgressCalculationHandler(object sender, ProgressChangedEventArgs e);
    197271    public event ProgressCalculationHandler ProgressCalculation;
    198     protected void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {
     272    protected void BwProgressChanged(object sender, ProgressChangedEventArgs e) {
    199273      BackgroundWorker worker = sender as BackgroundWorker;
    200274      if (!worker.CancellationPending && ProgressCalculation != null) {
     
    215289      public string Calculator { get; set; }
    216290      public string Partition { get; set; }
     291      public string Variable { get; set; }
     292      public int Frames { get; set; }
    217293    }
    218294  }
Note: See TracChangeset for help on using the changeset viewer.