public static double SilhouetteIndex(ClusteredItem datum, Partition clusters) { //Calculate A double distA = 0.0; KPoint datumPoint = clusters.Points[datum.Id]; foreach (ClusteredItem d in clusters.Clusters[datum.ClusterId].Points) { distA += datumPoint.elucideanDistance(clusters.Points[d.Id]); } distA /= (double)(clusters.Clusters[datum.ClusterId].Points.Count - 1); double minB = double.MaxValue; for (int i = 0; i < clusters.Clusters.Count; i++) { if (i != datum.ClusterId) { double distB = 0.0; foreach (ClusteredItem d in clusters.Clusters[i].Points) { distB += datumPoint.elucideanDistance(clusters.Points[d.Id]); } distB /= (double)(clusters.Clusters[i].Points.Count); if (distB < minB) { minB = distB; } } } return((minB - distA) / Math.Max(minB, distA)); }
public MinHeapPriorityQueue <KPoint> NearestNeighbors(KPoint p, int k, MinHeapPriorityQueue <KPoint> Q, BallTreeNode B) { if (p[B.PivotDim] > Q.peek().elucideanDistance(p)) { return(Q); } else if (B.IsLeaf()) { if (p.elucideanDistance(B.Point) < p.elucideanDistance(Q.peek())) { if (Q.Count >= k) { Q.extractMin(); } } } return(Q); }