示例#1
0
        /// <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);
        }
示例#2
0
        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}");
            }
        }
示例#3
0
 /// <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));