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));
        }
Exemplo n.º 2
0
 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);
 }