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