// 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; }
// 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); }