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