Changeset 16529 for branches/2520_PersistenceReintegration/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs
- Timestamp:
- 01/10/19 15:40:44 (5 years ago)
- Location:
- branches/2520_PersistenceReintegration
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2520_PersistenceReintegration
- Property svn:mergeinfo changed
-
branches/2520_PersistenceReintegration/HeuristicLab.Algorithms.DataAnalysis
- Property svn:mergeinfo changed
-
branches/2520_PersistenceReintegration/HeuristicLab.Algorithms.DataAnalysis/3.4
- Property svn:mergeinfo changed
-
branches/2520_PersistenceReintegration/HeuristicLab.Algorithms.DataAnalysis/3.4/NearestNeighbour/NearestNeighbourModel.cs
r16462 r16529 1 #region License Information1 #region License Information 2 2 /* HeuristicLab 3 3 * Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL) … … 37 37 38 38 private readonly object kdTreeLockObject = new object(); 39 39 40 private alglib.nearestneighbor.kdtree kdTree; 40 41 public alglib.nearestneighbor.kdtree KDTree { … … 49 50 } 50 51 51 52 52 public override IEnumerable<string> VariablesUsedForPrediction { 53 53 get { return allowedInputVariables; } … … 60 60 [Storable] 61 61 private int k; 62 [Storable(DefaultValue = false)] 63 private bool selfMatch; 62 64 [Storable(DefaultValue = null)] 63 65 private double[] weights; // not set for old versions loaded from disk … … 95 97 kdTree.x = (double[])original.kdTree.x.Clone(); 96 98 kdTree.xy = (double[,])original.kdTree.xy.Clone(); 97 99 selfMatch = original.selfMatch; 98 100 k = original.k; 99 101 isCompatibilityLoaded = original.IsCompatibilityLoaded; … … 108 110 this.classValues = (double[])original.classValues.Clone(); 109 111 } 110 public NearestNeighbourModel(IDataset dataset, IEnumerable<int> rows, int k, string targetVariable, IEnumerable<string> allowedInputVariables, IEnumerable<double> weights = null, double[] classValues = null)112 public NearestNeighbourModel(IDataset dataset, IEnumerable<int> rows, int k, bool selfMatch, string targetVariable, IEnumerable<string> allowedInputVariables, IEnumerable<double> weights = null, double[] classValues = null) 111 113 : base(targetVariable) { 112 114 Name = ItemName; 113 115 Description = ItemDescription; 116 this.selfMatch = selfMatch; 114 117 this.k = k; 115 118 this.allowedInputVariables = allowedInputVariables.ToArray(); … … 130 133 .Select(name => { 131 134 var pop = dataset.GetDoubleValues(name, rows).StandardDeviationPop(); 132 return pop.IsAlmost(0) ? 1.0 : 1.0/pop;135 return pop.IsAlmost(0) ? 1.0 : 1.0 / pop; 133 136 }) 134 137 .Concat(new double[] { 1.0 }) // no scaling for target variable … … 199 202 int numNeighbours; 200 203 lock (kdTreeLockObject) { // gkronber: the following calls change the kdTree data structure 201 numNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, false);204 numNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, selfMatch); 202 205 alglib.nearestneighbor.kdtreequeryresultsdistances(kdTree, ref dists); 203 206 alglib.nearestneighbor.kdtreequeryresultsxy(kdTree, ref neighbours); 204 207 } 205 208 if (selfMatch) { 209 // weights for neighbours are 1/d. 210 // override distances (=0) of exact matches using 1% of the distance of the next closest non-self-match neighbour -> selfmatches weight 100x more than the next closest neighbor. 211 // if all k neighbours are selfmatches then they all have weight 0.01. 212 double minDist = dists[0] + 1; 213 for (int i = 0; i < numNeighbours; i++) { 214 if ((minDist > dists[i]) && (dists[i] != 0)) { 215 minDist = dists[i]; 216 } 217 } 218 minDist /= 100.0; 219 for (int i = 0; i < numNeighbours; i++) { 220 if (dists[i] == 0) { 221 dists[i] = minDist; 222 } 223 } 224 } 206 225 double distanceWeightedValue = 0.0; 207 226 double distsSum = 0.0; … … 236 255 lock (kdTreeLockObject) { 237 256 // gkronber: the following calls change the kdTree data structure 238 numNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, false);257 numNeighbours = alglib.nearestneighbor.kdtreequeryknn(kdTree, x, k, selfMatch); 239 258 alglib.nearestneighbor.kdtreequeryresultsdistances(kdTree, ref dists); 240 259 alglib.nearestneighbor.kdtreequeryresultsxy(kdTree, ref neighbours);
Note: See TracChangeset
for help on using the changeset viewer.