// this method compute distance between clusters thas has subclusters (cluster2 represents the new cluster) public static double ComputeDistance(Cluster cluster1, Cluster cluster2, DissimilarityMatrix dissimilarityMatrix, Strategy strategy) { double distance1, distance2, distance = 0; //get the distance between cluster1 and subcluster0 of the cluster2 distance1 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterPair(cluster1, cluster2.GetSubCluster(0))); //get the distance between cluster1 and subcluster1 of the cluster cluster2 distance2 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterPair(cluster1, cluster2.GetSubCluster(1))); switch (strategy) { case Strategy.SingleLinkage: distance = _MinValue(distance1, distance2); break; case Strategy.CompleteLinkage: distance = _MaxValue(distance1, distance2); break; case Strategy.AverageLinkageWPGMA: distance = (distance1 + distance2) / 2; break; case Strategy.AverageLinkageUPGMA: distance = ((cluster2.GetSubCluster(0).TotalQuantityOfPatterns *distance1) / cluster2.TotalQuantityOfPatterns) + ((cluster2.GetSubCluster(1).TotalQuantityOfPatterns *distance2) / cluster2.TotalQuantityOfPatterns); break; default: break; } return(distance); }
// compute the distance between all pair of clusters and store it on the dissimilarity matrix. this algorithm step is done using parallelization to improve performance. private void _BuildDissimilarityMatrixParallel() { double distanceBetweenTwoClusters; _dissimilarityMatrix = new DissimilarityMatrix(); Parallel.ForEach(_ClusterPairCollection(), clusterPair => { distanceBetweenTwoClusters = ClusterDistance.ComputeDistance(clusterPair.Cluster1, clusterPair.Cluster2); _dissimilarityMatrix.AddClusterPairAndDistance(clusterPair, distanceBetweenTwoClusters); }); }
// calcula a distancia entre todos os clusters e as armazena na matrix de dissimilaridade private void CreateDissimilarityMatrix() { double distanceBetweenTwoClusters; _dissimilarityMatrix = new DissimilarityMatrix(); ClusterPair clusterPair; for (int i = 0; i < _clusters.Count(); i++) { for (int j = i + 1; j < _clusters.Count(); j++) { clusterPair = new ClusterPair(); clusterPair.Cluster1 = _clusters.GetCluster(i); clusterPair.Cluster2 = _clusters.GetCluster(j); distanceBetweenTwoClusters = ClusterDistance.ComputeDistance(clusterPair.Cluster1, clusterPair.Cluster2); _dissimilarityMatrix.AddClusterPairAndDistance(clusterPair, distanceBetweenTwoClusters); } } }