Ejemplo n.º 1
0
        private static void HandleOldCluster(List <FeatureVector> vectors,
                                             ICollection <ClusterGroup> clusters, ClusterGroup oldCluster)
        {
            var oldCustomers = vectors.FindAll(c => c.Cluster == oldCluster);

            if (oldCustomers.Count == 0)
            {
                clusters.Remove(oldCluster);
            }

            if (oldCustomers.Count > 0)
            {
                oldCluster.Prototype = oldCustomers[0].Features;
            }

            foreach (var c in oldCustomers)
            {
                oldCluster.AssignAnd(c.Features);
            }
        }
Ejemplo n.º 2
0
        private void CreateClusters(List <FeatureVector> Vectors, IList <ClusterGroup> Clusters)
        {
            var foundPrototype = false;
            var currentIter    = 0;

            while (!foundPrototype)
            {
                foundPrototype = true;

                foreach (var featureVector in Vectors)
                {
                    foreach (var cluster in Clusters)
                    {
                        if (cluster == featureVector.Cluster)
                        {
                            continue;
                        }
                        if (!SimilarityTest(cluster.Prototype, featureVector.Features))
                        {
                            continue;
                        }
                        if (!AttentionTest(cluster.Prototype, featureVector.Features))
                        {
                            continue;
                        }

                        var oldCluster = featureVector.Cluster;
                        featureVector.Cluster = cluster;

                        if (oldCluster != null)
                        {
                            HandleOldCluster(Vectors, Clusters, oldCluster);
                        }

                        var newVectors = Vectors.FindAll(c => c.Cluster == cluster);
                        if (newVectors.Count > 0)
                        {
                            cluster.Prototype = newVectors[0].Features;
                        }

                        foreach (var v in newVectors)
                        {
                            cluster.AssignAnd(v.Features);
                        }

                        foundPrototype = false;
                        break;
                    }

                    if (featureVector.Cluster != null)
                    {
                        continue;
                    }

                    var newCluster = new ClusterGroup(featureVector);
                    Clusters.Add(newCluster);
                    featureVector.Cluster = newCluster;
                    foundPrototype        = false;
                }
                currentIter++;
                if (currentIter > MaxIterations)
                {
                    break;
                }
            }
        }