1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


7  * HeuristicLab is free software: you can redistribute it and/or modify


8  * it under the terms of the GNU General Public License as published by


9  * the Free Software Foundation, either version 3 of the License, or


10  * (at your option) any later version.


11  *


12  * HeuristicLab is distributed in the hope that it will be useful,


13  * but WITHOUT ANY WARRANTY; without even the implied warranty of


14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the


15  * GNU General Public License for more details.


16  *


17  * You should have received a copy of the GNU General Public License


18  * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.


19  */


20  #endregion


21 


22  using System;


23  using System.Collections.Generic;


24  using System.Linq;


25  using HeuristicLab.Common;


26  using HeuristicLab.Core;


27  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


28 


29  namespace HeuristicLab.Problems.DataAnalysis {


30  [StorableClass]


31  [Item("PointCertaintyWeightCalculator", "")]


32  public class PointCertaintyWeightCalculator : DiscriminantClassificationWeightCalculator {


33 


34  public PointCertaintyWeightCalculator()


35  : base() {


36  }


37  [StorableConstructor]


38  protected PointCertaintyWeightCalculator(bool deserializing) : base(deserializing) { }


39  protected PointCertaintyWeightCalculator(PointCertaintyWeightCalculator original, Cloner cloner)


40  : base(original, cloner) {


41  }


42  public override IDeepCloneable Clone(Cloner cloner) {


43  return new PointCertaintyWeightCalculator(this, cloner);


44  }


45 


46  protected override IEnumerable<double> DiscriminantCalculateWeights(IEnumerable<IDiscriminantFunctionClassificationSolution> discriminantSolutions) {


47  List<double> weights = new List<double>();


48  IClassificationProblemData problemData = discriminantSolutions.ElementAt(0).ProblemData;


49  // class Values are the same in all problem data sets


50  double avg = problemData.ClassValues.Average();


51 


52  IEnumerable<double> targetValues;


53  IEnumerator<double> trainingValues;


54 


55  foreach (var solution in discriminantSolutions) {


56  problemData = solution.ProblemData;


57  targetValues = GetValues(problemData.Dataset.GetDoubleValues(problemData.TargetVariable).ToList(), problemData.TrainingIndizes);


58  trainingValues = targetValues.GetEnumerator();


59 


60  IEnumerator<double> estimatedTrainingVal = solution.EstimatedTrainingValues.GetEnumerator();


61  IEnumerator<double> estimatedTrainingClassVal = solution.EstimatedTrainingClassValues.GetEnumerator();


62 


63  double curWeight = 0.0;


64  while (estimatedTrainingVal.MoveNext() && estimatedTrainingClassVal.MoveNext() && trainingValues.MoveNext()) {


65  if (estimatedTrainingClassVal.Current.Equals(trainingValues.Current)) {


66  curWeight += 0.5;


67  double distanceToPoint = Math.Abs(estimatedTrainingVal.Current  avg);


68  double distanceToClass = Math.Abs(trainingValues.Current  avg);


69  if (trainingValues.Current > avg && estimatedTrainingVal.Current > avg


70   trainingValues.Current < avg && estimatedTrainingVal.Current < avg)


71  curWeight += distanceToPoint < distanceToClass ? (0.5 / distanceToClass) * distanceToPoint : 0.5;


72  }


73  }


74  // normalize the weight (otherwise a model with a bigger training partition would probably be better)


75  weights.Add(curWeight / targetValues.Count());


76  }


77  return weights;


78  }


79  }


80  }

