Esempio n. 1
0
        /// <summary>
        /// Seperates a dataset into clusters or groups with similar characteristics
        /// </summary>
        /// <param name="clusters">A collection of data clusters</param>
        /// <param name="data">An array containing data to b eclustered</param>
        /// <returns>A collection of clusters of data</returns>
        public static ClusterCollection ClusterDataSet(ClusterCollection clusters, double [,] data)
        {
            double [] dataPoint;

            double [] clusterMean;

            double firstClusterDistance = 0.0;

            double secondClusterDistance = 0.0;

            int rowCount = data.GetUpperBound(0) + 1;

            int fieldCount = data.GetUpperBound(1) + 1;

            int position = 0;


            // create a new collection of clusters
            ClusterCollection newClusters = new ClusterCollection();

            for (int count = 0; count < clusters.Count; count++)
            {
                Cluster newCluster = new Cluster();

                newClusters.Add(newCluster);
            }


            if (clusters.Count <= 0)
            {
                throw new SystemException("Cluster Count Cannot Be Zero!");
            }


            //((20+30)/2), ((170+160)/2), ((80+120)/2)
            for (int row = 0; row < rowCount; row++)
            {
                dataPoint = new double[fieldCount];

                for (int field = 0; field < fieldCount; field++)
                {
                    dataPoint.SetValue((data[row, field]), field);
                }

                for (int cluster = 0; cluster < clusters.Count; cluster++)
                {
                    clusterMean = clusters[cluster].ClusterMean;

                    if (cluster == 0)
                    {
                        firstClusterDistance = KMeans.EuclideanDistance(dataPoint, clusterMean);

                        position = cluster;
                    }
                    else
                    {
                        secondClusterDistance = KMeans.EuclideanDistance(dataPoint, clusterMean);

                        if (firstClusterDistance > secondClusterDistance)
                        {
                            firstClusterDistance = secondClusterDistance;

                            position = cluster;
                        }
                    }
                }

                newClusters[position].Add(dataPoint);
            }

            return(newClusters);
        }
Esempio n. 2
0
        /// <summary>
        /// Seperates a dataset into clusters or groups with similar characteristics
        /// </summary>
        /// <param name="clusterCount">The number of clusters or groups to form</param>
        /// <param name="data">An array containing data that will be clustered</param>
        /// <returns>A collection of clusters of data</returns>
        public static ClusterCollection ClusterDataSet(int clusterCount, double [,] data)
        {
            //bool stableClusterFormation = false;

            int clusterNumber = 0;

            int rowCount = data.GetUpperBound(0) + 1;

            int fieldCount = data.GetUpperBound(1) + 1;

            int stableClustersCount = 0;

            int iterationCount = 0;

            double [] dataPoint;

            Random random = new Random();

            Cluster cluster = null;

            ClusterCollection clusters = new ClusterCollection();

            System.Collections.ArrayList clusterNumbers = new System.Collections.ArrayList(clusterCount);


            while (clusterNumbers.Count < clusterCount)
            {
                clusterNumber = random.Next(0, rowCount - 1);

                if (!clusterNumbers.Contains(clusterNumber))
                {
                    cluster = new Cluster();

                    clusterNumbers.Add(clusterNumber);

                    dataPoint = new double[fieldCount];


                    for (int field = 0; field < fieldCount; field++)
                    {
                        dataPoint.SetValue((data[clusterNumber, field]), field);
                    }

                    cluster.Add(dataPoint);

                    clusters.Add(cluster);
                }
            }


            while (stableClustersCount != clusters.Count)
            {
                stableClustersCount = 0;

                ClusterCollection newClusters = KMeans.ClusterDataSet(clusters, data);

                for (int clusterIndex = 0; clusterIndex < clusters.Count; clusterIndex++)
                {
                    if ((KMeans.EuclideanDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean)) == 0)
                    {
                        stableClustersCount++;
                    }
                }

                iterationCount++;

                clusters = newClusters;
            }

            return(clusters);
        }
Esempio n. 3
0
        // K-Means
        private void Kmeans(Dictionary<int, Dictionary<int, double>> data, int clusters, string type, string codage)
        {
            double[,] db = null;
            if (data.Count > 1)
                if (codage != "Binaire")
                    db = convertData(data);
                else
                    db = convertDataBin(data);
            else
                return;

            Console.WriteLine("Donnees convertie");

            cluster = KMeans.ClusterDataSet(clusters, db, type);
            //MessageBox.Show(this,"Nombre de cluster : " + cluster.Count);
            Console.WriteLine("Kmeans calcule");
            //Dictionary<int, int> stationCluster = new Dictionary<int, int>();
            stationCluster = new Dictionary<int, int>();
            for (int i = 0; i < cluster.Count; i++)
            {
                Console.WriteLine("Cluster : " + i + " - Taille : " + cluster[i].Count);
                //string s = "Cluster " + i + ", taille = " + cluster[i].getValues.Count + " : ";
                foreach (int z in cluster[i].getValues)
                {
                    //Console.WriteLine(stations[z]);
                    int temp = stations[z];
                    stationCluster.Add(temp, i);
                    //string s = stations[z] + " : " + i ;
                }
            }
            ScrollableMaps maps = new ScrollableMaps();
            maps.drawClusters(stationCluster);
            PictureBox map = maps.mapBox;
            map.SizeMode = PictureBoxSizeMode.Zoom;
            map.Dock = DockStyle.Fill;
            Panel tempPanel = new Panel();
            tempPanel.Dock = DockStyle.Fill;

            combo1 = new ComboBox();
            combo1.Text = "Affichage des statistiques pour les clusters";
            combo1.Items.Add("Tous les clusters");
            combo1.Items.Add("Altitudes");
            combo1.Items.Add("Point of Interest");
            for (int i = 0; i < cluster.Count; i++)
                combo1.Items.Add(i);
            combo1.SelectedIndexChanged += changeCluster;
            combo1.Dock = DockStyle.Top;

            tempPanel.Controls.Add(combo1);
            tempPanel.Controls.Add(map);

            panel.addControls(tempPanel);
        }
Esempio n. 4
0
        /// <summary>
        /// Seperates a dataset into clusters or groups with similar characteristics
        /// </summary>
        /// <param name="clusterCount">The number of clusters or groups to form</param>
        /// <param name="data">An array containing data that will be clustered</param>
        /// <returns>A collection of clusters of data</returns>
        public static ClusterCollection ClusterDataSet(int clusterCount, double[,] data, string type)
        {
            //bool stableClusterFormation = false;

            int clusterNumber = 0;

            int rowCount = data.GetUpperBound(0) + 1;

            int fieldCount = data.GetUpperBound(1) + 1;

            int stableClustersCount = 0;

            int iterationCount = 0;

            double[] dataPoint;

            Random random = new Random();

            Cluster cluster = null;

            ClusterCollection clusters = new ClusterCollection();

            System.Collections.ArrayList clusterNumbers = new System.Collections.ArrayList(clusterCount);


            while (clusterNumbers.Count < clusterCount)
            {
                clusterNumber = random.Next(0, rowCount - 1);

                if (!clusterNumbers.Contains(clusterNumber))
                {
                    cluster = new Cluster();

                    clusterNumbers.Add(clusterNumber);

                    dataPoint = new double[fieldCount];


                    for (int field = 0; field < fieldCount; field++)
                    {
                        dataPoint.SetValue((data[clusterNumber, field]), field);
                    }

                    cluster.Add(dataPoint);

                    clusters.Add(cluster);
                }
            }

            int compteur = 0;

            while (stableClustersCount != clusters.Count)
            {
                stableClustersCount = 0;

                bool isNotGood = false;

                ClusterCollection newClusters = KMeans.ClusterDataSet(clusters, data, type);
                for (int tempo = 0; tempo < newClusters.Count; tempo++)
                {
                    if (newClusters[tempo].Count < 1)
                    {
                        isNotGood = true;
                    }
                }

                if (compteur == 10)
                {
                    return(clusters);
                }

                if (isNotGood)
                {
                    compteur++;
                    continue;
                }

                for (int clusterIndex = 0; clusterIndex < clusters.Count; clusterIndex++)
                {
                    double distance = 0;

                    switch (type)
                    {
                    case "DTW":
                        distance = (KMeans.DtwDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean));
                        break;

                    case "Manhattan":
                        distance = (KMeans.ManhattanDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean));
                        break;

                    default:
                        distance = (KMeans.EuclideanDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean));
                        break;
                    }
                    if (distance == 0)
                    {
                        stableClustersCount++;
                    }
                }

                iterationCount++;

                clusters = newClusters;
            }

            return(clusters);
        }
Esempio n. 5
0
        /// <summary>
        /// Seperates a dataset into clusters or groups with similar characteristics
        /// </summary>
        /// <param name="clusters">A collection of data clusters</param>
        /// <param name="data">An array containing data to b eclustered</param>
        /// <returns>A collection of clusters of data</returns>
        public static ClusterCollection ClusterDataSet(ClusterCollection clusters, double[,] data, string type)
        {
            double[] dataPoint;

            double[] clusterMean;

            double firstClusterDistance = 0.0;

            double secondClusterDistance = 0.0;

            int rowCount = data.GetUpperBound(0) + 1;

            int fieldCount = data.GetUpperBound(1) + 1;

            int position = 0;

            // create a new collection of clusters
            ClusterCollection newClusters = new ClusterCollection();

            for (int count = 0; count < clusters.Count; count++)
            {
                Cluster newCluster = new Cluster();

                newClusters.Add(newCluster);
            }

            if (clusters.Count <= 0)
            {
                throw new SystemException("Cluster Count Cannot Be Zero!");
            }

            //((20+30)/2), ((170+160)/2), ((80+120)/2)
            for (int row = 0; row < rowCount; row++)
            {
                dataPoint = new double[fieldCount];

                for (int field = 0; field < fieldCount; field++)
                {
                    dataPoint.SetValue((data[row, field]), field);
                }

                for (int cluster = 0; cluster < clusters.Count; cluster++)
                {
                    clusterMean = clusters[cluster].ClusterMean;

                    if (cluster == 0)
                    {
                        switch (type)
                        {
                            case "DTW":
                                firstClusterDistance = KMeans.DtwDistance(dataPoint, clusterMean);
                                break;
                            case "Manhattan":
                                firstClusterDistance = KMeans.ManhattanDistance(dataPoint, clusterMean);
                                break;
                            default:
                                firstClusterDistance = KMeans.EuclideanDistance(dataPoint, clusterMean);
                                break;
                        }

                        position = cluster;
                    }
                    else
                    {
                        switch (type)
                        {
                            case "DTW":
                                secondClusterDistance = KMeans.DtwDistance(dataPoint, clusterMean);
                                break;
                            case "Manhattan":
                                secondClusterDistance = KMeans.ManhattanDistance(dataPoint, clusterMean);
                                break;
                            default:
                                secondClusterDistance = KMeans.EuclideanDistance(dataPoint, clusterMean);
                                break;
                        }
                        if (firstClusterDistance > secondClusterDistance)
                        {
                            firstClusterDistance = secondClusterDistance;

                            position = cluster;
                        }
                    }
                }

                newClusters[position].Add(dataPoint);
                newClusters[position].AddValue(row);
            }

            return newClusters;
        }
Esempio n. 6
0
        /// <summary>
        /// Seperates a dataset into clusters or groups with similar characteristics
        /// </summary>
        /// <param name="clusterCount">The number of clusters or groups to form</param>
        /// <param name="data">An array containing data that will be clustered</param>
        /// <returns>A collection of clusters of data</returns>
        public static ClusterCollection ClusterDataSet(int clusterCount, double[,] data, string type)
        {
            //bool stableClusterFormation = false;

            int clusterNumber = 0;

            int rowCount = data.GetUpperBound(0) + 1;

            int fieldCount = data.GetUpperBound(1) + 1;

            int stableClustersCount = 0;

            int iterationCount = 0;

            double[] dataPoint;

            Random random = new Random();

            Cluster cluster = null;

            ClusterCollection clusters = new ClusterCollection();

            System.Collections.ArrayList clusterNumbers = new System.Collections.ArrayList(clusterCount);

            while (clusterNumbers.Count < clusterCount)
            {
                clusterNumber = random.Next(0, rowCount - 1);

                if (!clusterNumbers.Contains(clusterNumber))
                {

                    cluster = new Cluster();

                    clusterNumbers.Add(clusterNumber);

                    dataPoint = new double[fieldCount];

                    for (int field = 0; field < fieldCount; field++)
                    {
                        dataPoint.SetValue((data[clusterNumber, field]), field);
                    }

                    cluster.Add(dataPoint);

                    clusters.Add(cluster);
                }
            }

            int compteur = 0;
            while (stableClustersCount != clusters.Count)
            {
                stableClustersCount = 0;

                bool isNotGood = false;

                ClusterCollection newClusters = KMeans.ClusterDataSet(clusters, data, type);
                for (int tempo = 0; tempo < newClusters.Count; tempo++)
                    if (newClusters[tempo].Count < 1)
                        isNotGood = true;

                if (compteur == 10)
                    return clusters;

                if (isNotGood)
                {
                    compteur++;
                    continue;
                }

                for (int clusterIndex = 0; clusterIndex < clusters.Count; clusterIndex++)
                {
                    double distance = 0;

                    switch (type)
                    {
                        case "DTW":
                            distance = (KMeans.DtwDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean));
                            break;
                        case "Manhattan":
                            distance = (KMeans.ManhattanDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean));
                            break;
                        default:
                            distance = (KMeans.EuclideanDistance(newClusters[clusterIndex].ClusterMean, clusters[clusterIndex].ClusterMean));
                            break;
                    }
                    if (distance == 0)
                    {
                        stableClustersCount++;
                    }
                }

                iterationCount++;

                clusters = newClusters;
            }

            return clusters;
        }