// this method compute distance between clusters thas has subclusters (cluster2 represents the new cluster) public static double ComputeNodeDistance(ClusterNode node1, ClusterNode node2, DissimilarityMatrix dissimilarityMatrix, Strategy strategy) { ClusterNode node21 = node2.NodeAt(0); ClusterNode node22 = node2.NodeAt(1); double distance1 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterNodePair(node1, node21)); double distance2 = dissimilarityMatrix.ReturnClusterPairDistance(new ClusterNodePair(node1, node22)); switch (strategy) { case Strategy.MinLinkage: return(distance1 < distance2 ? distance1 : distance2); case Strategy.MaxLinkage: return(distance1 > distance2 ? distance1 : distance2); case Strategy.AverageLinkage: return((distance1 + distance2) / 2); case Strategy.AverageLinkageWeighted: return(distance1 * node21.TotalLeafsCount / node2.TotalLeafsCount + distance2 * node22.TotalLeafsCount / node2.TotalLeafsCount); default: return(0); } }
private void BuildHierarchicalClustering(int indexNewNode, ClusterDistance.Strategy strategy, int k) { ClusterNodePair closestClusterPair = dissimilarityMatrix.GetClosestClusterPair(); ClusterNode newNode = new ClusterNode(); newNode.Add(closestClusterPair.Cluster1); newNode.Add(closestClusterPair.Cluster2); newNode.Id = indexNewNode; newNode.Distance = dissimilarityMatrix.ReturnClusterPairDistance(closestClusterPair); newNode.UpdateTotalLeafs(); nodeCollection.Remove(closestClusterPair.Cluster1); nodeCollection.Remove(closestClusterPair.Cluster2); UpdateDissimilarityMatrix(newNode, strategy); nodeCollection.Add(newNode); if (nodeCollection.Count > k) { BuildHierarchicalClustering(indexNewNode + 1, strategy, k); } }