/// <summary> /// Calculates and returns width of a gaussian function </summary> /// <param name="centroid"> </param> /// <param name="nearestNeighbours"> </param> /// <returns> </returns> private double calculateSigma(KVector centroid, KVector[] nearestNeighbours) { double sigma = 0; foreach (KVector nn in nearestNeighbours) { sigma += Math.Pow(centroid.distanceFrom(nn), 2); } sigma = Math.Sqrt(1 / ((double)nearestNeighbours.Length) * sigma); return(sigma); }
/// <summary> /// http://en.wikipedia.org/wiki/Selection_algorithm </summary> /// <param name="vector"> </param> /// <param name="k"> </param> /// <returns> </returns> public virtual KVector[] getKNearestNeighbours(KVector vector, int k) { KVector[] nearestNeighbours = new KVector[k]; // calculate distances for entire dataset foreach (KVector otherVector in dataSet) { double distance = vector.distanceFrom(otherVector); otherVector.Distance = distance; } for (int i = 0; i < k; i++) { int minIndex = i; KVector minVector = dataSet[i]; double minDistance = minVector.Distance; for (int j = i + 1; j < dataSet.Count; j++) { if (dataSet[j].Distance <= minDistance) { minVector = dataSet[j]; minDistance = minVector.Distance; minIndex = j; } } // swap list[i] and list[minIndex] KVector temp = dataSet[i]; dataSet[i] = dataSet[minIndex]; dataSet[minIndex] = temp; nearestNeighbours[i] = dataSet[i]; } // function select(list[1..n], k) // for i from 1 to k // minIndex = i // minValue = list[i] // for j from i+1 to n // if list[j] < minValue // minIndex = j // minValue = list[j] // swap list[i] and list[minIndex] // return list[k] return(nearestNeighbours); }