Changeset 13787 for branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/KNearestNeighborRecommender.cs
- Timestamp:
- 04/24/16 10:03:52 (8 years ago)
- Location:
- branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders
- Files:
-
- 1 added
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem.Common/3.3/Recommenders/KNearestNeighborRecommender.cs
r13786 r13787 23 23 using HeuristicLab.Core; 24 24 using HeuristicLab.Data; 25 using HeuristicLab.Optimization;26 25 using HeuristicLab.Parameters; 27 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 using System.Collections.Generic;29 using System.Linq;30 27 31 28 namespace HeuristicLab.OptimizationExpertSystem.Common { … … 33 30 [StorableClass] 34 31 public sealed class KNearestNeighborRecommender : ParameterizedNamedItem, IAlgorithmInstanceRecommender { 35 private KnowledgeCenter okc; 36 37 private IFixedValueParameter<EnumValue<ProblemInstanceProximityType>> ProximityTypeParameter { 38 get { return (IFixedValueParameter<EnumValue<ProblemInstanceProximityType>>)Parameters["ProximityType"]; } 39 } 40 41 public ProblemInstanceProximityType ProximityType { 42 get { return ProximityTypeParameter.Value.Value; } 43 set { ProximityTypeParameter.Value.Value = value; } 44 } 45 32 46 33 private IFixedValueParameter<IntValue> KParameter { 47 34 get { return (IFixedValueParameter<IntValue>)Parameters["K"]; } … … 52 39 private KNearestNeighborRecommender(KNearestNeighborRecommender original, Cloner cloner) 53 40 : base(original, cloner) { } 54 public KNearestNeighborRecommender(KnowledgeCenter okc) { 55 this.okc = okc; 56 Parameters.Add(new FixedValueParameter<EnumValue<ProblemInstanceProximityType>>("ProximityType", "The type of neighbor proximity.", new EnumValue<ProblemInstanceProximityType>(ProblemInstanceProximityType.FeatureSpace))); 41 public KNearestNeighborRecommender() { 57 42 Parameters.Add(new FixedValueParameter<IntValue>("K", "The number of nearest neighbors to consider.", new IntValue(5))); 58 43 } … … 62 47 } 63 48 64 public IEnumerable<IAlgorithm> GetRanking() { 65 if (okc.Problem.ProblemId == -1) yield break; 66 67 var distances = okc.GetProblemDistances(ProximityType); 68 var K = KParameter.Value.Value; 69 var performances = new Dictionary<IAlgorithm, List<double>>(); 70 for (var k = 0; k < K; k++) { 71 if (distances.Count == 0) break; 72 var min = distances.MinItems(x => x.Value).First(); 73 // lookup algorithm performances in min 74 var perfs = okc.GetAlgorithmPerformance(min.Key); 75 if (perfs.Count == 0) { 76 k--; 77 continue; 78 } 79 foreach (var p in perfs) { 80 var ert = p.Value; 81 if (double.IsNaN(ert)) ert = int.MaxValue; 82 List<double> erts; 83 if (!performances.TryGetValue(p.Key, out erts)) { 84 performances[p.Key] = new List<double>() { ert }; ; 85 } else erts.Add(ert); 86 } 87 distances.Remove(min.Key); 88 } 89 foreach (var alg in performances.Select(x => new { Alg = x.Key, Perf = x.Value.Average() }) 90 .OrderBy(x => x.Perf) 91 .Select(x => x.Alg)) 92 yield return alg; 49 public IRecommendationModel TrainModel(KnowledgeCenter kc, string[] characteristics) { 50 return new KNearestNeighborModel(KParameter.Value.Value, characteristics); 93 51 } 94 52 }
Note: See TracChangeset
for help on using the changeset viewer.