/// <summary> /// Evaluates all given <see cref="ClusterSet{TInstance}" />s according to the given /// <see cref="IInternalEvaluationCriterion{TInstance}" />. /// </summary> /// <param name="clustering">The cluster-sets to be evaluated.</param> /// <param name="criterion">The criterion used to evaluate the cluster-sets.</param> /// <param name="maxClusters">The maximum number of clusters allowed for a cluster-set for it to be evaluated.</param> /// <returns>A list containing the evaluations for each cluster-set.</returns> /// <typeparam name="TInstance">The type of instance considered.</typeparam> public static ICollection <ClusterSetEvaluation <TInstance> > EvaluateClustering <TInstance>( this ClusteringResult <TInstance> clustering, IInternalEvaluationCriterion <TInstance> criterion, uint maxClusters) where TInstance : IComparable <TInstance> { var evals = new List <ClusterSetEvaluation <TInstance> >(); // checks only one cluster allowed if (maxClusters == 1) { evals.Add(new ClusterSetEvaluation <TInstance>(clustering[0], double.NaN)); return(evals); } // evaluates all cluster-sets foreach (var clusterSet in clustering.Reverse()) { if (clusterSet.Count < 2 || clusterSet.Count > maxClusters) { continue; } var eval = criterion.Evaluate(clusterSet); evals.Add(new ClusterSetEvaluation <TInstance>(clusterSet, eval)); } return(evals); }
private static void GetBestPartition( ClusteringResult <DataPoint> clustering, IInternalEvaluationCriterion <DataPoint> criterion, string criterionName) { // gets coeffs for all cluster-sets var evals = clustering.EvaluateClustering(criterion); // saves cluster-sets indexes to CSV file SaveToCsv(evals, Path.GetFullPath(Path.Combine(RESULTS_PATH, $"{criterionName}.csv")), criterionName); // gets max coeff var maxEval = new ClusterSetEvaluation <DataPoint>(null, double.MinValue); foreach (var eval in evals) { if (eval.EvaluationValue > maxEval.EvaluationValue) { maxEval = eval; } } // prints cluster set info Console.WriteLine("======================================"); Console.WriteLine($"Max {criterionName}: {maxEval.EvaluationValue:0.00}"); if (maxEval.ClusterSet == null) { return; } Console.WriteLine( $"Clusters at distance: {maxEval.ClusterSet.Dissimilarity:0.00} ({maxEval.ClusterSet.Count})"); foreach (var cluster in maxEval.ClusterSet) { Console.WriteLine($" - {cluster}"); } }
/// <summary> /// Evaluates all given <see cref="ClusterSet{TInstance}" />s according to the given /// <see cref="IInternalEvaluationCriterion{TInstance}" />. The maximum number of clusters allowed in a cluster-set for /// it to be evaluated corresponds to sqrt(N/2), where N is the total number of instances clustered. /// </summary> /// <param name="clustering">The cluster-sets to be evaluated.</param> /// <param name="criterion">The criterion used to evaluate the cluster-sets.</param> /// <returns>A list containing the evaluations for each cluster-set.</returns> /// <typeparam name="TInstance">The type of instance considered.</typeparam> public static ICollection <ClusterSetEvaluation <TInstance> > EvaluateClustering <TInstance>( this ClusteringResult <TInstance> clustering, IInternalEvaluationCriterion <TInstance> criterion) where TInstance : IComparable <TInstance> => EvaluateClustering(clustering, criterion, (uint)Math.Sqrt(clustering.Count / 2d));