Changeset 8492 for branches/DatasetFeatureCorrelation/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation.cs
- Timestamp:
- 08/14/12 17:35:07 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DatasetFeatureCorrelation/HeuristicLab.Problems.DataAnalysis/3.4/Implementation/FeatureCorrelation.cs
r8483 r8492 98 98 } 99 99 100 public void CalculateTimeframeElements(string calc, string partition, string variable, int frames) { 101 CalculateElements(problemData.Dataset, calc, partition, variable, frames); 102 } 103 100 104 private void CalculateElements(Dataset dataset) { 101 105 CalculateElements(dataset, CorrelationCalculators.First(), Partitions.First()); 102 106 } 103 107 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) { 105 109 if (bw == null || bw.IsBusy) { 106 110 if (bw != null) { … … 110 114 bw.WorkerReportsProgress = true; 111 115 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 }); 117 121 if (calc.Equals(PearsonsR) || calc.Equals(SpearmansRank)) { 118 122 Maximum = 1.0; … … 127 131 } 128 132 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) { 130 144 BackgroundWorker worker = sender as BackgroundWorker; 131 145 … … 139 153 int length = doubleVariableNames.Count; 140 154 double[,] elements = new double[length, length]; 141 142 155 double calculations = (Math.Pow(length, 2) + length) / 2; 143 156 … … 151 164 } 152 165 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 172 171 elements[j, i] = elements[i, j]; 173 172 if (!error.Equals(OnlineCalculatorError.None)) { … … 181 180 } 182 181 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) { 184 250 BackgroundWorker worker = sender as BackgroundWorker; 185 251 if (!e.Cancelled && !worker.CancellationPending) { … … 188 254 } else { 189 255 matrix = (double[,])e.Result; 190 OnReset(); 191 } 192 } 193 } 256 OnCorrelationCalculationFinished(); 257 } 258 } 259 } 260 #endregion 194 261 195 262 #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 196 270 public delegate void ProgressCalculationHandler(object sender, ProgressChangedEventArgs e); 197 271 public event ProgressCalculationHandler ProgressCalculation; 198 protected void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {272 protected void BwProgressChanged(object sender, ProgressChangedEventArgs e) { 199 273 BackgroundWorker worker = sender as BackgroundWorker; 200 274 if (!worker.CancellationPending && ProgressCalculation != null) { … … 215 289 public string Calculator { get; set; } 216 290 public string Partition { get; set; } 291 public string Variable { get; set; } 292 public int Frames { get; set; } 217 293 } 218 294 }
Note: See TracChangeset
for help on using the changeset viewer.