示例#1
0
        // Calcula a menor distancia entre todos os grupos
        private static double MinDistanceBetweenClusters(Cluster[] clusters)
        {
            DissimilarityMatrix dissimilarityMatrix = new DissimilarityMatrix();

            for (int i = 0; i < clusters.Count() - 1; i++)
            {
                for (int j = i + 1; j < clusters.Count(); j++)
                {
                    CalculateDistanceBetweenClusters(clusters[i], clusters[j], dissimilarityMatrix);
                }
            }

            return(dissimilarityMatrix.GetLowestDistance());
        }
        /// <summary>
        /// Computes the distance.
        /// </summary>
        /// <param name="cluster1">The cluster1.</param>
        /// <param name="cluster2">The cluster2.</param>
        /// <param name="dissimilarityMatrix">The dissimilarity matrix.</param>
        /// <param name="strategy">The strategy.</param>
        /// <returns>Distance between clusters</returns>
        public static double ComputeDistance(Cluster cluster1, Cluster cluster2, DissimilarityMatrix dissimilarityMatrix, MergeStrategy strategy)
        {
            double distance = 0;
            var distance1 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterPair(cluster1, cluster2.GetSubCluster(0)));
            var distance2 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterPair(cluster1, cluster2.GetSubCluster(1)));

            // computes distance by using merge strategy
            switch (strategy)
            {
                case MergeStrategy.SingleLinkage:
                    distance = _MinValue(distance1, distance2); // Min(x, y)
                    break;
                case MergeStrategy.CompleteLinkage:
                    distance = _MaxValue(distance1, distance2); // Max(x, y)
                    break;
                case MergeStrategy.AverageLinkageWpgma:
                    distance = (distance1 + distance2) / 2; // Avg(x, y)
                    break;
                case MergeStrategy.AverageLinkageUpgma:
                    distance = ((cluster2.GetSubCluster(0).QuantityOfDataPoints * distance1) / cluster2.QuantityOfDataPoints) 
                               + ((cluster2.GetSubCluster(1).QuantityOfDataPoints * distance2) / cluster2.QuantityOfDataPoints); // WeightedAvg(x, y)
                    break;
                case MergeStrategy.CentroidMethod:
                    cluster1.SetCentroid();
                    cluster2.SetCentroid();
                    distance = Distance.GetDistance(cluster1.Centroid, cluster2.Centroid,
                        DistanceMetric.SquareEuclidianDistance); // Distance of centroids
                    break;
                case MergeStrategy.WardsMethod:

                    Cluster newCluster = new Cluster();
                    newCluster.AddSubCluster(cluster1);
                    newCluster.AddSubCluster(cluster2);
                    newCluster.SetCentroid();

                    distance = newCluster.GetSumOfSquaredError(DistanceMetric.EuclidianDistance) 
                               - cluster1.GetSumOfSquaredError(DistanceMetric.EuclidianDistance) 
                               - cluster2.GetSumOfSquaredError(DistanceMetric.EuclidianDistance);
                    // SEO(xy) - SEO(x) - SEO(y)
                    break;
            }

            return distance;

        }
示例#3
0
        // Calcula a menor distancia entre dois grupos
        private static void CalculateDistanceBetweenClusters(Cluster cluster0, Cluster cluster1, DissimilarityMatrix dissimilarityMatrix)
        {
            double distanceBetweenClusters = 0.0;             // distancia entre dois grupos
            double minDistance             = Double.MaxValue; // menor distancia entre dois grupos

            foreach (Pattern patternCluster0 in cluster0.GetPatterns())
            {
                foreach (Pattern patternCluster1 in cluster1.GetPatterns())
                {
                    distanceBetweenClusters = Metrics.Distance.CalculatePatternDistance(patternCluster0, patternCluster1);

                    if (distanceBetweenClusters < minDistance)
                    {
                        minDistance = distanceBetweenClusters;
                    }
                }
            }

            dissimilarityMatrix.AddClusterPairAndDistance(new ClusterPair(cluster0, cluster1), minDistance);
        }