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)); }
private void ClusteredItemMouseClick(object sender, MouseButtonEventArgs e) { FrameworkElement element = sender as FrameworkElement; if (element != null) { ClusteredItem item = element.DataContext as ClusteredItem; if (item != null) { ClusteredDataSource dataSource = item.DataSource; if (dataSource != null) { dataSource.Collapse(item.Data); } } } }