/// <summary>
        ///     Computes the natural clustering of the resulting trajectories (behaviors) along with the behavioral entropy
        ///     (diversity).
        /// </summary>
        /// <param name="evaluationUnits">The agent/maze evaluations to cluster and compute entropy.</param>
        /// <param name="clusterImprovementThreshold">
        ///     The number of cluster additions that are permitted without further
        ///     maximization of silhouette width.  When this is exceeded, the incremental cluster additions will stop and the
        ///     number of clusters resulting in the highest silhouette width will be considered optimal.
        /// </param>
        /// <returns></returns>
        public static ClusterDiversityUnit CalculateNaturalClustering(
            IList<MazeNavigatorEvaluationUnit> evaluationUnits, int clusterImprovementThreshold)
        {
            Dictionary<int, double> clusterSilhoutteMap = new Dictionary<int, double>();
            Tuple<int, double> clusterWithMaxSilhouetteWidth = null;

            // Always start with zero clusters and increment on first iteration of loop
            const int initClusterCnt = 0;

            // Only consider successful trials
            IList<MazeNavigatorEvaluationUnit> successfulEvaluations =
                evaluationUnits.Where(eu => eu.IsMazeSolved).ToList();

            // Define the trajectory matrix in which to store all trajectory points for each trajectory
            // (this becomes a collection of observation vectors that's fed into k-means)
            double[][] trajectoryMatrix = new double[successfulEvaluations.Count][];

            // Get the maximum observation vector length (max simulation runtime)
            // (multiplied by 2 to account for each timestep containing a 2-dimensional position)
            int maxObservationLength = successfulEvaluations.Max(x => x.NumTimesteps)*2;

            for (int idx = 0; idx < successfulEvaluations.Count; idx++)
            {
                // If there are few observations than the total elements in the observation vector,
                // fill out the vector with the existing observations and set the rest equal to the last
                // position in the simulation
                if (successfulEvaluations[idx].AgentTrajectory.Length < maxObservationLength)
                {
                    trajectoryMatrix[idx] =
                        successfulEvaluations[idx].AgentTrajectory.Concat(
                            Enumerable.Repeat(
                                successfulEvaluations[idx].AgentTrajectory[
                                    successfulEvaluations[idx].AgentTrajectory.Length - 1],
                                maxObservationLength - successfulEvaluations[idx].AgentTrajectory.Length)).ToArray();
                }
                // If they are equal, just set the trajectory points
                else
                {
                    trajectoryMatrix[idx] = successfulEvaluations[idx].AgentTrajectory;
                }
            }

            // Set the initial cluster count
            int clusterCount = initClusterCnt;

            // Continue loop until the maximum number of iterations without silhouette width improvement has elapsed
            // (also don't allow number of clusters to match the number of observations)
            while (clusterWithMaxSilhouetteWidth == null || (clusterSilhoutteMap.Count <= clusterImprovementThreshold ||
                                                             clusterSilhoutteMap.Where(
                                                                 csm =>
                                                                     (csm.Key - initClusterCnt) >=
                                                                     clusterSilhoutteMap.Count -
                                                                     clusterImprovementThreshold)
                                                                 .Any(
                                                                     csm =>
                                                                         csm.Value >=
                                                                         clusterWithMaxSilhouetteWidth.Item2)) &&
                   clusterCount < trajectoryMatrix.Length - 1)
            {
                // Increment cluster count
                clusterCount++;

                // Create a new k-means instance with the specified number of clusters
                var kmeans = new KMeans(clusterCount);

                // TODO: The below logic is in support of a work-around to an Accord.NET bug wherein
                // TODO: an internal random number generator sometimes generates out-of-bounds values
                // TODO: (i.e. a probability that is not between 0 and 1)
                // TODO: https://github.com/accord-net/framework/issues/259
                // Use uniform initialization
                kmeans.UseSeeding = Seeding.Uniform;

                // Determine the resulting clusters
                var clusters = kmeans.Learn(trajectoryMatrix);

                // Compute the silhouette width for the current number of clusters
                double silhouetteWidth = ComputeSilhouetteWidth(clusters, trajectoryMatrix);

                // Compute silhouette width and add to map with the current cluster count
                clusterSilhoutteMap.Add(clusterCount, silhouetteWidth);

                // If greater than the max silhouette width, reset the cluster with the max
                if (clusterWithMaxSilhouetteWidth == null || silhouetteWidth > clusterWithMaxSilhouetteWidth.Item2)
                {
                    clusterWithMaxSilhouetteWidth = new Tuple<int, double>(clusterCount, silhouetteWidth);
                }
            }

            // Rerun kmeans for the final cluster count
            var optimalClustering = new KMeans(clusterCount);

            // TODO: The below logic is in support of a work-around to an Accord.NET bug wherein
            // TODO: an internal random number generator sometimes generates out-of-bounds values
            // TODO: (i.e. a probability that is not between 0 and 1)
            // TODO: https://github.com/accord-net/framework/issues/259
            // Use uniform initialization
            optimalClustering.UseSeeding = Seeding.Uniform;

            // Determine cluster assignments
            optimalClustering.Learn(trajectoryMatrix);

            double sumLogProportion = 0.0;

            // Compute the shannon entropy of the population
            for (int idx = 0; idx < optimalClustering.Clusters.Count; idx++)
            {
                sumLogProportion += optimalClustering.Clusters[idx].Proportion*
                                    Math.Log(optimalClustering.Clusters[idx].Proportion, 2);
            }

            // Multiply by negative one to get the Shannon entropy
            double shannonEntropy = sumLogProportion*-1;

            // Return the resulting cluster diversity info
            return new ClusterDiversityUnit(optimalClustering.Clusters.Count, shannonEntropy);
        }
Example #2
0
 public Dictionary<int, List<int>> apply(Matrix<double> objCoords, int K, int depth)
 {
     Dictionary<int, List<int>> dict = new Dictionary<int, List<int>>();
     double[][] objects = new double[objCoords.RowCount][];
     for (int rowIdx = 0; rowIdx < objCoords.RowCount; rowIdx++)
     {
         objects[rowIdx] = new double[objCoords.ColumnCount];
         for (int columnIdx = 0; columnIdx < objCoords.ColumnCount; columnIdx++)
         {
             objects[rowIdx][columnIdx] = objCoords[rowIdx, columnIdx];
         }
     }
     KMeans kmeans = new KMeans(K);
     int[] clusterIDs = kmeans.Compute(objects);
     for (int objIdx = 0; objIdx < clusterIDs.Length; objIdx++)
     {
         int clusterID = clusterIDs[objIdx];
         List<int> currentElements;
         if (dict.TryGetValue(clusterID, out currentElements))
         {
             currentElements.Add(objIdx);
             dict[clusterID] = currentElements;
         }
         else
         {
             dict[clusterID] = new List<int>(new int[] { objIdx });
         }
     }
     return dict;
 }
 public static void CompareStratMeansVar(KMeans km1, KMeans km2, out double[] meanPvalues, out double[] varPvalues)
 {
     meanPvalues = null;
     varPvalues = null;
     int nPv1 = km1.Clusters.Count;
     int nPv2 = km2.Clusters.Count;
     if (nPv1 != nPv2)
     {
         System.Windows.Forms.MessageBox.Show("Not the same number of strata! Models are not comparable!");
         return;
     }
     meanPvalues = new double[nPv1];
     varPvalues = new double[nPv2];
     for (int i = 0; i < nPv1; i++)
     {
         KMeansCluster kmC1 = km1.Clusters[i];
         KMeansCluster kmC2 = km2.Clusters[i];
         double[] means1 = kmC1.Mean;
         double[] means2 = kmC2.Mean;
         double[,] cov1 = kmC1.Covariance;
         double[,] cov2 = kmC2.Covariance;
         double m, v;
         PairedTTestPValues(means1, cov1, means2, cov2, out m, out v);
         meanPvalues[i] = m;
         varPvalues[i] = v;
     }
 }
Example #4
0
        private void btnGenerateRandom_Click(object sender, EventArgs e)
        {
            k = (int)numClusters.Value;

            // Generate data with n Gaussian distributions
            double[][][] data = new double[k][][];

            for (int i = 0; i < k; i++)
            {
                // Create random centroid to place the Gaussian distribution
                double[] mean = Matrix.Random(2, -6.0, +6.0);

                // Create random covariance matrix for the distribution
                double[,] covariance = Accord.Statistics.Tools.RandomCovariance(2, -5, 5);

                // Create the Gaussian distribution
                var gaussian = new MultivariateNormalDistribution(mean, covariance);

                int samples = Accord.Math.Tools.Random.Next(150, 250);
                data[i] = gaussian.Generate(samples);
            }

            // Join the generated data
            mixture = Matrix.Stack(data);

            // Update the scatterplot
            CreateScatterplot(graph, mixture, k);

            // Forget previous initialization
            kmeans = null;
        }
Example #5
0
        private void btnRun_Click(object sender, EventArgs e)
        {
            // Retrieve the number of clusters
            int k = (int)numClusters.Value;

            // Load original image
            Bitmap image = Properties.Resources.leaf;

            // Transform the image into an array of pixel values
            double[][] pixels = image.ToDoubleArray();


            // Create a K-Means algorithm using given k and a
            //  square euclidean distance as distance metric.
            KMeans kmeans = new KMeans(k, Distance.SquareEuclidean);

            // Compute the K-Means algorithm until the difference in
            //  cluster centroids between two iterations is below 0.05
            int[] idx = kmeans.Compute(pixels, 0.05);


            // Replace every pixel with its corresponding centroid
            pixels.ApplyInPlace((x, i) => kmeans.Clusters.Centroids[idx[i]]);

            // Show resulting image in the picture box
            pictureBox.Image = pixels.ToBitmap(image.Width, image.Height);
        }
Example #6
0
        public void KMeansConstructorTest()
        {

            Accord.Math.Tools.SetupGenerator(0);


            // Declare some observations
            double[][] observations = 
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            double[][] orig = observations.MemberwiseClone();

            // Create a new K-Means algorithm with 3 clusters 
            KMeans kmeans = new KMeans(3);

            // Compute the algorithm, retrieving an integer array
            //  containing the labels for each of the observations
            int[] labels = kmeans.Compute(observations);

            // As a result, the first two observations should belong to the
            //  same cluster (thus having the same label). The same should
            //  happen to the next four observations and to the last three.

            Assert.AreEqual(labels[0], labels[1]);

            Assert.AreEqual(labels[2], labels[3]);
            Assert.AreEqual(labels[2], labels[4]);
            Assert.AreEqual(labels[2], labels[5]);

            Assert.AreEqual(labels[6], labels[7]);
            Assert.AreEqual(labels[6], labels[8]);

            Assert.AreNotEqual(labels[0], labels[2]);
            Assert.AreNotEqual(labels[2], labels[6]);
            Assert.AreNotEqual(labels[0], labels[6]);


            int[] labels2 = kmeans.Clusters.Nearest(observations);
            Assert.IsTrue(labels.IsEqual(labels2));

            // the data must not have changed!
            Assert.IsTrue(orig.IsEqual(observations));
        }
 /// <summary>
 ///  Deserialization
 /// </summary>
 public Gesture(SerializationInfo info, StreamingContext ctxt)
 {
     //Get the values from info and assign them to the appropriate properties
     this.name = (String)info.GetValue("name", typeof(string));
     this.sampleDimensionsCount = (int)info.GetValue("sampleDimensionsCount", typeof(int));
     this.frameCount = (int)info.GetValue("frameCount", typeof(int));
     this.trainingSampleCount = (int)info.GetValue("trainingSampleCount", typeof(int));
     this.alphabetCount = (int)info.GetValue("alphabetCount", typeof(int));
     this.statesCount = (int)info.GetValue("statesCount", typeof(int));
     this.trainingDataKMeans = (KMeans)info.GetValue("trainingDataKMeans", typeof(KMeans));
     this.recognitionThreshold = (double)info.GetValue("recognitionThreshold", typeof(double));
     this.model = (HiddenMarkovModel)info.GetValue("model", typeof(HiddenMarkovModel));
 }
        public int[] Classify()
        {
            var clusterData = features.Select();
            var theta = MinMaxTheta(clusterData);

            var args = new BsasArgs(theta, m_iterations, clusterData, m_thetaStepNum);

            var bsas = new BasicSequentialAlgorithmicScheme(args);
            var clusters = bsas.CalculateClasses();
            var kmeans = new KMeans(clusters, Distance.Euclidean);
            var idx = kmeans.Compute(clusterData);

            return idx;
        }
        /// <summary>
        /// The cluster.
        /// </summary>
        /// <param name="clustersCount">
        /// The clusters count.
        /// </param>
        /// <param name="data">
        /// The data.
        /// </param>
        /// <returns>
        /// The <see cref="T:int[]"/>.
        /// </returns>
        public int[] Cluster(int clustersCount, double[][] data)
        {
            KMeans kMeans = new KMeans(clustersCount);

            var clusters = kMeans.Learn(data);
            var result = new int[data.Length];

            for (int i = 0; i < result.Length; i++)
            {
                result[i] = clusters.Decide(data[i]);
            }

            return result;
        }
        /// <summary>
        /// Initializes a new instance of GestureProcessingLibrary.Gesture for the specified gesture name.
        /// </summary>
        /// <param name="name">The name of the gesture to be modeled</param>
        /// <param name="alphabetCount">The number of alphabet signs in the model</param>
        /// <param name="statesCount">The number of hidden states in the model</param>
        public Gesture(string name, int alphabetCount = 8, int statesCount = 12)
        {
            this.name = name;
            this.trainingData = DataMethods.LoadPositionData(this.name);

            this.sampleDimensionsCount = trainingData[0][0].Count();
            this.frameCount = trainingData[0].Count();
            this.trainingSampleCount = trainingData.Count();
            this.statesCount = statesCount;

            this.alphabetCount = alphabetCount;
            this.trainingDataKMeans = new KMeans(alphabetCount);

            this.TrainModel();
        }
	public static void Main() {
		modshogun.init_shogun_with_defaults();
		int k = 3;
		// already tried init_random(17)
		Math.init_random(17);

		double[,] fm_train = Load.load_numbers("../data/fm_train_real.dat");

		RealFeatures feats_train = new RealFeatures(fm_train);
		EuclideanDistance distance = new EuclideanDistance(feats_train, feats_train);

		KMeans kmeans = new KMeans(k, distance);
		kmeans.train();

		double[,] out_centers = kmeans.get_cluster_centers();
		kmeans.get_radiuses();

	}
Example #12
0
        public static Output Clustering(double[,] patches, int numberOfClusters)
        {
            // "Generator.Seed" sets a random seed for the framework's main internal number generator, which
            // gets a reference to the random number generator used internally by the Accord.NET classes and methods.
            // If set to a value less than or equal to zero, all generators will start with the same fixed seed, even among multiple threads.
            // If set to any other value, the generators in other threads will start with fixed, but different, seeds.
            // this method should be called before other computations.
            Accord.Math.Random.Generator.Seed = 0;

            KMeans kmeans = new KMeans(k: numberOfClusters)
            {
                UseSeeding = Seeding.KMeansPlusPlus,
                Distance   = default(Cosine),
            };

            var clusters = kmeans.Learn(patches.ToJagged());

            // get the cluster size
            Dictionary <int, double>   clusterIdSize     = new Dictionary <int, double>();
            Dictionary <int, double[]> clusterIdCentroid = new Dictionary <int, double[]>();

            foreach (var clust in clusters.Clusters)
            {
                clusterIdSize.Add(clust.Index, clust.Proportion);
                clusterIdCentroid.Add(clust.Index, clust.Centroid);
            }

            var output = new Output()
            {
                ClusterIdCentroid = clusterIdCentroid,
                ClusterIdSize     = clusterIdSize,
                Clusters          = clusters,
            };

            return(output);
        }
Example #13
0
        /// <summary>
        ///   Runs the K-Means algorithm.
        /// </summary>
        ///
        private void runKMeans()
        {
            // Retrieve the number of clusters
            int k = (int)numClusters.Value;

            // Load original image
            Bitmap image = Properties.Resources.leaf;

            // Create converters
            ImageToArray imageToArray = new ImageToArray(min: -1, max: +1);
            ArrayToImage arrayToImage = new ArrayToImage(image.Width, image.Height, min: -1, max: +1);

            // Transform the image into an array of pixel values
            double[][] pixels; imageToArray.Convert(image, out pixels);


            // Create a K-Means algorithm using given k and a
            //  square Euclidean distance as distance metric.
            KMeans kmeans = new KMeans(k, new SquareEuclidean())
            {
                Tolerance = 0.05
            };

            // Compute the K-Means algorithm until the difference in
            //  cluster centroids between two iterations is below 0.05
            int[] idx = kmeans.Learn(pixels).Decide(pixels);


            // Replace every pixel with its corresponding centroid
            pixels.Apply((x, i) => kmeans.Clusters.Centroids[idx[i]], result: pixels);

            // Show resulting image in the picture box
            Bitmap result; arrayToImage.Convert(pixels, out result);

            pictureBox.Image = result;
        }
Example #14
0
    internal static ArrayList run(int para)
    {
        modshogun.init_shogun_with_defaults();
        int k = para;
        init_random(17);

        DoubleMatrix fm_train = Load.load_numbers("../data/fm_train_real.dat");

        RealFeatures feats_train = new RealFeatures(fm_train);
        EuclidianDistance distance = new EuclidianDistance(feats_train, feats_train);

        KMeans kmeans = new KMeans(k, distance);
        kmeans.train();

        DoubleMatrix out_centers = kmeans.get_cluster_centers();
        kmeans.get_radiuses();

        ArrayList result = new ArrayList();
        result.Add(kmeans);
        result.Add(out_centers);

        modshogun.exit_shogun();
        return result;
    }
Example #15
0
        public void KMeansMoreClustersThanSamples()
        {
            Accord.Math.Tools.SetupGenerator(0);


            // Declare some observations
            double[][] observations =
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            double[][] orig = observations.MemberwiseClone();

            KMeans kmeans = new KMeans(15);

            bool thrown = false;

            try
            {
                int[] labels = kmeans.Compute(observations);
            }
            catch (ArgumentException)
            {
                thrown = true;
            }

            Assert.IsTrue(thrown);
        }
Example #16
0
        public void DeserializationTest1()
        {
            MemoryStream stream = new MemoryStream(Properties.Resources.kmeans);

            KMeans kmeans = Serializer.Load <KMeans>(stream);


            KMeans kbase = new KMeans(3);

            Assert.AreEqual(kbase.Iterations, kmeans.Iterations);
            Assert.AreEqual(kbase.MaxIterations, kmeans.MaxIterations);
            Assert.AreEqual(kbase.Tolerance, kmeans.Tolerance);

            Assert.AreEqual(kbase.UseSeeding, kmeans.UseSeeding);
            Assert.AreEqual(kbase.ComputeCovariances, kmeans.ComputeCovariances);

            Assert.AreEqual(kbase.ComputeError, kmeans.ComputeError);
            Assert.AreEqual(kbase.ComputeCovariances, kmeans.ComputeCovariances);
            Assert.AreEqual(kbase.Error, kmeans.Error);

            Assert.IsTrue(kbase.ComputeError);
            Assert.IsTrue(kbase.ComputeCovariances);
            Assert.AreEqual(kbase.Distance.GetType(), kmeans.Distance.GetType());
        }
Example #17
0
        private void Calculate()
        {
            KMeans kMeans = new KMeans(Points, Clusters);

            var finish = true;

            while (finish)
            {
                var distance = kMeans.Cluster();

                var clusters = kMeans.GetClusters();

                Thread.Sleep(2000);

                UpdateGraphData(clusters);

                if (distance == 0)
                {
                    finish = false;
                }
            }

            MessageBox.Show(@"Done");
        }
 private void buildModel()
 {
     if (inputMatrix == null) getMatrix();
     kmeans = new KMeans(k);
     kmeans.Compute(inputMatrix,0.0001);
     lbl = new List<string>();
     for (int i = 0; i < k; i++)
     {
         lbl.Add(i.ToString());
     }
 }
Example #19
0
        /// <summary>
        ///   Runs the K-Means algorithm.
        /// </summary>
        /// 
        private void runKMeans()
        {
            // Retrieve the number of clusters
            int k = (int)numClusters.Value;

            // Load original image
            Bitmap image = Properties.Resources.leaf;

            // Create converters
            ImageToArray imageToArray = new ImageToArray(min: -1, max: +1);
            ArrayToImage arrayToImage = new ArrayToImage(image.Width, image.Height, min: -1, max: +1);

            // Transform the image into an array of pixel values
            double[][] pixels; imageToArray.Convert(image, out pixels);


            // Create a K-Means algorithm using given k and a
            //  square Euclidean distance as distance metric.
            KMeans kmeans = new KMeans(k, Distance.SquareEuclidean)
            {
                Tolerance = 0.05
            };

            // Compute the K-Means algorithm until the difference in
            //  cluster centroids between two iterations is below 0.05
            int[] idx = kmeans.Compute(pixels);


            // Replace every pixel with its corresponding centroid
            pixels.ApplyInPlace((x, i) => kmeans.Clusters.Centroids[idx[i]]);

            // Show resulting image in the picture box
            Bitmap result; arrayToImage.Convert(pixels, out result);

            pictureBox.Image = result;
        }
 public void runKMeans()
 {
     KMeans.runKMeans(weightsByCreature, creatures);
     Debug.Log("updating clusters");
 }
 private void makeKMeans()
 {
     kmeans = new KMeans(k);
     KMeansClusterCollection kmeansColl = kmeans.Clusters;
     for (int i = 0; i < k; i++)
     {
         double[] mns = meansLst[i];
         double p = proportionsLst[i];
         double[,] scov = scovLst[i];
         KMeansCluster kc = new KMeansCluster(kmeansColl, i);
         kc.Mean = mns;
         kc.Covariance = scov;
         kc.Proportion = p;
     }
 }
        // 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);
        }
Example #23
0
        /// <summary>
        ///   Initializes the Gaussian Mixture Models using K-Means
        ///   parameters as an initial parameter guess.
        /// </summary>
        /// 
        private void btnInitialize_Click(object sender, EventArgs e)
        {
            // Creates and computes a new 
            // K-Means clustering algorithm:

            kmeans = new KMeans(k);
            kmeans.Compute(mixture);

            // Classify all instances in mixture data
            int[] classifications = kmeans.Clusters.Nearest(mixture);

            // Draw the classifications
            updateGraph(classifications);
        }
Example #24
0
        public static Tuple <Dictionary <string, Dictionary <int, List <Room> > >, Dictionary <string, double[, ]> > Factorize(List <Room> rooms, int dimensionReduction)
        {
            Dictionary <string, double[, ]> matrices = new Dictionary <string, double[, ]>();
            int column = 0;
            int size   = 0;

            foreach (var room in rooms)
            {
                foreach (var layer in room.objects)
                {
                    if (!matrices.ContainsKey(layer.Key))
                    {
                        size = layer.Value.GetLength(0) * layer.Value.GetLength(1);
                        matrices[layer.Key] = new double[rooms.Count, layer.Value.GetLength(0) * layer.Value.GetLength(1)];
                    }
                    matrices[layer.Key].FillColumn(column, layer.Value);
                }
                column++;
            }
            Dictionary <string, double[, ]> Ws         = new Dictionary <string, double[, ]>();
            Dictionary <string, double[, ]> Hs         = new Dictionary <string, double[, ]>();
            Dictionary <string, double[, ]> components = new Dictionary <string, double[, ]>();

            foreach (var mat in matrices)
            {
                PrincipalComponentAnalysis pca = new PrincipalComponentAnalysis(mat.Value);
                pca.Compute();
                for (int ii = 0; ii < dimensionReduction; ii++)
                {
                    pca.ComponentMatrix.rowToMatrix(ii, 12, 10).matToBitmap(0, 0).Save("pca" + mat.Key + ii + ".png");
                }
                components[mat.Key] = pca.ComponentMatrix;
                for (int jj = 0; jj < rooms.Count; jj++)
                {
                    rooms[jj].setCoefficients(mat.Key, pca.Result, jj, dimensionReduction);
                }

                /*
                 * NMF nmf = new NMF(mat.Value, dimensionReduction, 2000);
                 * Ws[mat.Key] = nmf.LeftNonnegativeFactors;
                 * Hs[mat.Key] = nmf.RightNonnegativeFactors;
                 * for (int ii = 0; ii < rooms.Count; ii++) {
                 *  rooms[ii].setCoefficients(mat.Key,nmf.RightNonnegativeFactors, ii);
                 * }
                 * string str = "";
                 * for (int xx = 0; xx < nmf.RightNonnegativeFactors.GetLength(1); xx++) {
                 *  for (int jj = 0; jj < nmf.RightNonnegativeFactors.GetLength(0); jj++) {
                 *      str += nmf.RightNonnegativeFactors[jj, xx] + ",";
                 *  }
                 *  str += "\n";
                 * }
                 * System.IO.File.WriteAllText(mat.Key + "W.txt", str);
                 * str = "";
                 * for (int xx = 0; xx < nmf.LeftNonnegativeFactors.GetLength(1); xx++) {
                 *  for (int jj = 0; jj < nmf.LeftNonnegativeFactors.GetLength(0); jj++) {
                 *      str += nmf.LeftNonnegativeFactors[jj, xx] + ",";
                 *  }
                 *  str += "\n";
                 * }
                 * System.IO.File.WriteAllText(mat.Key + "H.txt", str);
                 * for (int ii = 0; ii < nmf.LeftNonnegativeFactors.GetLength(1); ii++) {
                 *  double[,] W = nmf.LeftNonnegativeFactors.rowToMatrix(ii, 12, 10);
                 *  W.matToBitmap(0, 25).Save(mat.Key + ii + "W.png");
                 * }
                 * if (mat.Key == "blocks") {
                 *  double[,] reconstructed = new double[12, 10];
                 *  for (int ii = 0; ii < rooms[0].coefficients["blocks"].Length; ii++) {
                 *      double w = rooms[0].coefficients["blocks"][ii];
                 *      int counter = 0;
                 *      for (int xx = 0; xx < 12; xx++) {
                 *          for (int yy = 0; yy < 10; yy++) {
                 *              reconstructed[xx, yy] += w * Ws["blocks"][counter, ii];
                 *              counter++;
                 *          }
                 *      }
                 *  }
                 *  reconstructed.matToBitmap(0, 1).Save("room0Reconstructed.png");
                 * }
                 * */
            }
            int counter = 0;

            //   double[,] xy = new double[rooms.Count,2];
            double[][] clusterData = new double[rooms.Count][];
            foreach (var room in rooms)
            {
                int      compCounter = 0;
                double[] coeffs      = new double[room.coefficients.Count * dimensionReduction];
                foreach (var comp in room.coefficients)
                {
                    foreach (var coef in comp.Value)
                    {
                        coeffs[compCounter] = coef;
                        compCounter++;
                    }
                }
                clusterData[counter] = coeffs;
                Room reconstructed = room.reconstruct(components, 1);
                reconstructed.toBitmap().Save("room" + counter + "Reconstructed.png");
                counter++;
            }
            int    numberofClusters = 25;
            KMeans kmeans           = new KMeans(numberofClusters);

            kmeans.Tolerance = 0.5;
            int[] clusters = kmeans.Compute(clusterData);
            Dictionary <string, SortedSet <int> > clusteredRooms        = new Dictionary <string, SortedSet <int> >();
            Dictionary <int, SortedSet <string> > roomClusters          = new Dictionary <int, SortedSet <string> >();
            Dictionary <string, Dictionary <int, List <Room> > > output = new Dictionary <string, Dictionary <int, List <Room> > >();

            int[] clusterCounts = new int[numberofClusters];
            for (int ii = 0; ii < rooms.Count; ii++)
            {
                rooms[ii].setType();
                if (!clusteredRooms.ContainsKey(rooms[ii].roomType))
                {
                    output[rooms[ii].roomType]         = new Dictionary <int, List <Room> >();
                    clusteredRooms[rooms[ii].roomType] = new SortedSet <int>();
                }
                if (!output[rooms[ii].roomType].ContainsKey(clusters[ii]))
                {
                    output[rooms[ii].roomType][clusters[ii]] = new List <Room>();
                }
                if (!roomClusters.ContainsKey(clusters[ii]))
                {
                    roomClusters[clusters[ii]] = new SortedSet <string>();
                }
                output[rooms[ii].roomType][clusters[ii]].Add(rooms[ii]);
                roomClusters[clusters[ii]].Add(rooms[ii].roomType);
                clusterCounts[clusters[ii]]++;
                clusteredRooms[rooms[ii].roomType].Add(clusters[ii]);
                //   Console.WriteLine(ii + " " + clusters[ii]);
            }
            for (int ii = 0; ii < clusterCounts.Length; ii++)
            {
                string str = "";
                foreach (var roomtype in roomClusters[ii])
                {
                    str += roomtype + " ";
                }
                //   Console.WriteLine("Cluster "+ ii + " = " +clusterCounts[ii] + " : " + str);
            }
            foreach (var roomType in clusteredRooms)
            {
                string str = "";
                foreach (var cluster in roomType.Value)
                {
                    str += cluster + " ";
                }
                //   Console.WriteLine(roomType.Key + " " + str);
            }
            return(new Tuple <Dictionary <string, Dictionary <int, List <Room> > >, Dictionary <string, double[, ]> >(output, components));
        }
Example #25
0
        public void IndexFiles(FileInfo[] imageFiles, System.ComponentModel.BackgroundWorker IndexBgWorker,
                               Action <string> logWriter,
                               LocateSettings locateSetting = null)
        {
            //For Time Profilling
            long      extractingTime, kMeanTime = 0, calcBagOfVisualTime = 0;
            Stopwatch sw1;

            SimpleSurfSift.LoCATe descriptorExtractor = new SimpleSurfSift.LoCATe();

            sw1 = Stopwatch.StartNew();
            logWriter("Index started, extracting Descriptors...");

            List <double[]>     ListofDescriptorsForCookBook = new List <double[]>();
            List <LoCATeRecord> ListOfAllImageDescriptors    = new List <LoCATeRecord>();



            int totalFileCount = imageFiles.Length;

            if (totalFileCount == 0)
            {
                logWriter("No files to index");
                return;
            }
            ;
            for (int i = 0; i < totalFileCount; i++)
            {
                var fi = imageFiles[i];

                using (Bitmap observerImage = (Bitmap)Image.FromFile(fi.FullName))
                {
                    List <double[]> locateDescriptors = descriptorExtractor.extract(observerImage, "SURF");
                    ListOfAllImageDescriptors.Add(new LoCATeRecord
                    {
                        Id                = i,
                        ImageName         = fi.Name,
                        ImagePath         = fi.FullName,
                        LoCATeDescriptors = locateDescriptors
                    });
                    if (locateSetting.IsCodeBookNeedToBeCreated)
                    {
                        if (locateDescriptors.Count > 4)
                        {
                            RandomHelper randNumGenerator = new RandomHelper();
                            List <int>   randIndexes      = randNumGenerator.GetRandomNumberInRange(0, locateDescriptors.Count, 10d);
                            foreach (int index in randIndexes)
                            {
                                ListofDescriptorsForCookBook.Add(locateDescriptors[index]);
                            }
                        }
                        else
                        {
                            Debug.WriteLine(fi.Name + " skip from index, because it didn't have significant feature");
                        }
                    }
                }
                IndexBgWorker.ReportProgress(i);
            }
            sw1.Stop();
            extractingTime = Convert.ToInt32(sw1.Elapsed.TotalSeconds);
            double[][] codeBook = null;
            if (locateSetting.IsCodeBookNeedToBeCreated)
            {
                logWriter("Indexing, Calculating Mean...");
                sw1.Reset(); sw1.Start();
                KMeans kMeans = new KMeans(locateSetting.SizeOfCodeBook);
                kMeans.Compute(ListofDescriptorsForCookBook.ToArray());
                codeBook = kMeans.Clusters.Centroids;
                //------------Save CookBook
                string fullFileName = locateSetting.CodeBookFullPath;
                if (File.Exists(fullFileName))
                {
                    File.Delete(fullFileName);
                }
                using (FileStream fs = new FileStream(fullFileName, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                        = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    bf.Serialize(fs, codeBook);
                    fs.Close();
                }
                sw1.Stop();
                kMeanTime = Convert.ToInt32(sw1.Elapsed.TotalSeconds);
            }
            else
            {
                string fullFileName = locateSetting.CodeBookFullPath;
                if (!File.Exists(fullFileName))
                {
                    string msg = string.Format("Couldn't find {0}, Please Index before querying with Locate", fullFileName);
                    throw new InvalidOperationException(msg);
                }
                using (FileStream fs = new FileStream(fullFileName, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                             = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    codeBook = (double[][])bf.Deserialize(fs);
                    fs.Close();
                }
            }

            logWriter("Indexing, Calculating Bag of Visual Words...");
            sw1.Reset(); sw1.Start();
            List <LoCaTeBoWRecord> ListOfImageVisualBagOfWorks = new List <LoCaTeBoWRecord>();

            for (int i = 0; i < ListOfAllImageDescriptors.Count; i++)
            {
                double[]        visualWordForImage = createVisualWord(ListOfAllImageDescriptors[i].LoCATeDescriptors, codeBook);
                LoCaTeBoWRecord rec = new LoCaTeBoWRecord
                {
                    Id         = ListOfAllImageDescriptors[i].Id,
                    ImageName  = ListOfAllImageDescriptors[i].ImageName,
                    ImagePath  = ListOfAllImageDescriptors[i].ImagePath,
                    VisaulWord = visualWordForImage
                };
                ListOfImageVisualBagOfWorks.Add(rec);
                IndexBgWorker.ReportProgress(i);
            }
            logWriter("Indexing, Calculating ltcData...");
            int[] histogramSumOfAllVisualWords = null;
            //------------Creating sum histogram of all words
            double[][] AllDatas = ListOfImageVisualBagOfWorks.Select(des => des.VisaulWord).ToArray();
            histogramSumOfAllVisualWords = createIndex((double[][])(AllDatas));
            //------------Creating Image Records Data
            LoCaTeDataSet locateDS = new LoCaTeDataSet
            {
                AllImageRecordSet            = ListOfImageVisualBagOfWorks,
                HistogramSumOfAllVisualWords = histogramSumOfAllVisualWords
            };

            logWriter("Indexing, Saving Image Data...");
            //------------Save CookBook
            string ImageRecordName = Path.Combine(DirectoryHelper.SaveDirectoryPath, "LoCATeImageRecords.bin");

            if (File.Exists(ImageRecordName))
            {
                File.Delete(ImageRecordName);
            }
            using (FileStream fs = new FileStream(ImageRecordName, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                    = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                bf.Serialize(fs, locateDS);
                fs.Close();
            }
            sw1.Stop();
            calcBagOfVisualTime = Convert.ToInt32(sw1.Elapsed.TotalSeconds);
            logWriter(string.Format("Extracting: {0} sec, KMeanTime: {1} sec, CalcBagOfVisalTime: {2} sec", extractingTime, kMeanTime, calcBagOfVisualTime));
        }
        public string kmeans(DataTable tbl)
        {
            Codification codebook = new Codification(tbl);

            DataTable symbols = codebook.Apply(tbl);

            double[][] inputs = symbols.ToIntArray("Clump Thickness", "Uniformity of Cell Size", "Uniformity of Cell Shape", "Marginal Adhesion", "Single Epithelial Cell Size", "Bare Nuclei", "Bland Chromatin", "Normal Nucleoli", "Mitoses").ToDouble();
            int sayac = 0;

            int[] outputs = symbols.ToIntArray("Class").GetColumn(0);

            // Declare some observations
            //double[][] observations =
            //    {
            //     new double[] { -5, -2, -1 },
            //     new double[] { -5, -5, -6 },
            //     new double[] {  2,  1,  1 },
            //     new double[] {  1,  1,  2 },
            //     new double[] {  1,  2,  2 },
            //     new double[] {  3,  1,  2 },
            //     new double[] { 11,  5,  4 },
            //     new double[] { 15,  5,  6 },
            //     new double[] { 10,  5,  6 },
            //    };

            KMeans kmeans = new KMeans(2);

            int[] labels = kmeans.Compute(inputs);

            int c = kmeans.Clusters.Nearest(new double[] { Convert.ToInt32(inputlar[0]), Convert.ToInt32(inputlar[1]),
                        Convert.ToInt32( inputlar[2]), Convert.ToInt32( inputlar[3]), Convert.ToInt32( inputlar[4]),
                        Convert.ToInt32( inputlar[5]), Convert.ToInt32( inputlar[6]), Convert.ToInt32( inputlar[7]), Convert.ToInt32( inputlar[8]) });
            return c.ToString(); ;
        }
Example #27
0
        static void Main(string[] args)
        {
#if Cluster
            // output file
            List <string> outputLines = new List <string>();

            DateTime timeStart = new DateTime();
            // Some example documents.
            string[] documents = new GetTweets().GetTweetsFromExcelFile("Train_NN.xlsx");

            // Apply TF*IDF to the documents and get the resulting vectors.
            double[][] inputs = TFIDF.Transform(documents, 0);
            Console.WriteLine("time to transformation " + (DateTime.Now - timeStart));
            outputLines.Add("time to transformation " + (DateTime.Now - timeStart));
            Console.WriteLine("TFIDF transformation done...");

            inputs = TFIDF.Normalize(inputs);
            Console.WriteLine("time to Normalization " + (DateTime.Now - timeStart));
            outputLines.Add("time to Normalization " + (DateTime.Now - timeStart));
            Console.WriteLine("TFIDF Normalization done...");
            //inputs = Accord.Math.Norm.Norm2(inputs);

            string[] topics = TFIDF.Topics(documents, 5);
            Console.WriteLine("time to topics " + (DateTime.Now - timeStart));
            outputLines.Add("time to topics " + (DateTime.Now - timeStart));
            Console.WriteLine("Topics gathered...");

            //Random random = new Random();
            //double[][] rand = new double[inputs.Length][];

            //for (int i = 0; i < inputs.Length; i++)
            //{

            //    rand[i] = new double[inputs[i].Length];
            //    for (int j = 0; j < inputs[i].Length; j++)
            //    {

            //        rand[i][j] = random.NextDouble();
            //    }
            //}
            //Console.WriteLine("time to generate random numbers " + (DateTime.Now - timeStart));
            //outputLines.Add("time to topics " + (DateTime.Now - timeStart));
            //Console.WriteLine("Randoms generated...");

            KMeans cluster = new KMeans(topics.Length, Distance.Cosine);

            //cluster.MaxIterations = 1;
            //cluster.Randomize(rand);
            int[] index = cluster.Compute(inputs);
            Console.WriteLine("time to cluster " + (DateTime.Now - timeStart));
            outputLines.Add("time to cluster " + (DateTime.Now - timeStart));
            Console.WriteLine("Clustering done...");
            //Accord.Statistics.Analysis.PrincipalComponentAnalysis pca = new Accord.Statistics.Analysis.PrincipalComponentAnalysis(inputs, Accord.Statistics.Analysis.AnalysisMethod.Center);
            //pca.Compute();
            //double[][] newinput = pca.Transform(inputs, 2);

            //ScatterplotBox.Show("KMeans Clustering of Tweets", newinput, index).Hold();



            for (double i = 0; i <= topics.Length; i++)
            {
                outputLines.Add(Convert.ToString(i + 1));
                List <string> topicDecider = new List <string>();
                string[]      topicString;

                int j = 0;
                foreach (int x in index)
                {
                    if (x == i + 1)
                    {
                        topicDecider.Add(documents[j]);
                    }
                    j++;
                }

                topicString = TFIDF.Topics(topicDecider.ToArray(), topicDecider.Count / 2);

                if (topicString.Length == 0)
                {
                    outputLines.Add("--------------------------------------------------------");
                    outputLines.Add("TOPIC: other");
                    outputLines.Add("--------------------------------------------------------");
                }
                else
                {
                    outputLines.Add("--------------------------------------------------------");
                    outputLines.Add("TOPIC: " + topicString[0]);
                    outputLines.Add("--------------------------------------------------------");
                }

                j = 0;
                foreach (int x in index)
                {
                    if (x == i + 1)
                    {
                        outputLines.Add("Tweet ID " + j + ":\t" + documents[j]);
                    }
                    j++;
                }
                outputLines.Add("");
                outputLines.Add("");
                outputLines.Add("");
                outputLines.Add("");
            }

            System.IO.File.WriteAllLines(@"Train_NN_2.txt", outputLines.ToArray());
            Console.WriteLine("Output is written...");
#else
            // output file
            List <string> outputLines = new List <string>();

            DateTime timeStart = new DateTime();
            // Some example documents.
            string[]   documents_Train = new GetTweets().GetTweetsFromExcelFile("Train_NN.xlsx");
            double[][] Train_Labels    = new GetTweets().GetLabelsFromExcelFile("Train_Labels.xlsx");

            // Apply TF*IDF to the documents and get the resulting vectors.
            double[][] inputs = TFIDF.Transform(documents_Train, 0);
            Console.WriteLine("time to transformation " + (DateTime.Now - timeStart));
            outputLines.Add("time to transformation " + (DateTime.Now - timeStart));
            Console.WriteLine("TFIDF transformation done...");

            inputs = TFIDF.Normalize(inputs);
            Console.WriteLine("time to Normalization " + (DateTime.Now - timeStart));
            outputLines.Add("time to Normalization " + (DateTime.Now - timeStart));
            Console.WriteLine("TFIDF Normalization done...");


            //double[][] inputs;
            double[][] train_input = new double[140][];
            double[][] outputs;
            double[][] testInputs  = new double[1000 - 140][];
            double[][] testOutputs = new double[1000 - 140][];

            for (int i = 0; i < 140; i++)
            {
                train_input[i] = new double[inputs[i].Length];
                for (int j = 0; j < inputs[i].Length; j++)
                {
                    train_input[i][j] = inputs[i][j];
                }
            }

            for (int i = 0; i < 1000 - 140; i++)
            {
                testInputs[i] = new double[inputs[i].Length];
                for (int j = 0; j < inputs[i].Length; j++)
                {
                    testInputs[i][j] = inputs[i][j];
                }
            }


            // The first 500 data rows will be for training. The rest will be for testing.
            //testInputs = inputs.Skip(500).ToArray();
            //testOutputs = outputs.Skip(500).ToArray();
            //inputs = inputs.Take(500).ToArray();
            //outputs = outputs.Take(500).ToArray();

            // Setup the deep belief network and initialize with random weights.
            DeepBeliefNetwork network = new DeepBeliefNetwork(train_input.First().Length, 7);
            new GaussianWeights(network, 0.1).Randomize();
            network.UpdateVisibleWeights();

            // Setup the learning algorithm.
            DeepBeliefNetworkLearning teacher = new DeepBeliefNetworkLearning(network)
            {
                Algorithm = (h, v, i) => new ContrastiveDivergenceLearning(h, v)
                {
                    LearningRate = 0.1,
                    Momentum     = 0.5,
                    Decay        = 0.001,
                }
            };

            // Setup batches of input for learning.
            int batchCount = Math.Max(1, train_input.Length / 100);
            // Create mini-batches to speed learning.
            int[]        groups  = Accord.Statistics.Tools.RandomGroups(train_input.Length, batchCount);
            double[][][] batches = train_input.Subgroups(groups);
            // Learning data for the specified layer.
            double[][][] layerData;

            // Unsupervised learning on each hidden layer, except for the output layer.
            for (int layerIndex = 0; layerIndex < network.Machines.Count - 1; layerIndex++)
            {
                teacher.LayerIndex = layerIndex;
                layerData          = teacher.GetLayerInput(batches);
                for (int i = 0; i < 200; i++)
                {
                    double error = teacher.RunEpoch(layerData) / train_input.Length;
                    if (i % 10 == 0)
                    {
                        Console.WriteLine(i + ", Error = " + error);
                    }
                }
            }

            // Supervised learning on entire network, to provide output classification.
            var teacher2 = new BackPropagationLearning(network)
            {
                LearningRate = 0.1,
                Momentum     = 0.5
            };

            //Transpose
            double[][] Train_Labels_T = new double[140][];
            for (int i = 0; i < 140; i++)
            {
                Train_Labels_T[i] = new double[7];
                for (int j = 0; j < 7; j++)
                {
                    Train_Labels_T[i][j] = Train_Labels[j][i];
                }
            }

            // Run supervised learning.
            for (int i = 0; i < 500; i++)
            {
                double error = teacher2.RunEpoch(train_input, Train_Labels_T) / train_input.Length;
                if (i % 10 == 0)
                {
                    Console.WriteLine(i + ", Error = " + error);
                }
            }
            outputLines.Add("time to Training " + (DateTime.Now - timeStart));
            // Test the resulting accuracy.
            double[][] outputValues = new double[testInputs.Length][];
            for (int i = 0; i < testInputs.Length; i++)
            {
                outputValues[i] = network.Compute(testInputs[i]);
            }
            outputLines.Add("time to Testing/clustering " + (DateTime.Now - timeStart));
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");

            List <string> class1 = new List <string>();
            List <string> class2 = new List <string>();
            List <string> class3 = new List <string>();
            List <string> class4 = new List <string>();
            List <string> class5 = new List <string>();
            List <string> class6 = new List <string>();
            List <string> class7 = new List <string>();

            //creating output file
            for (int i = 0; i < documents_Train.Length; i++)
            {
                if (i < 10 && i > -1)
                {
                    if (i == 0)
                    {
                        class1.Add("-------------------------------");
                        class1.Add("TOPIC: WEATHER");
                        class1.Add("-------------------------------");
                    }
                    class1.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i < 20 && i > 9)
                {
                    if (i == 10)
                    {
                        class2.Add("-------------------------------");
                        class2.Add("TOPIC: MUSIC");
                        class2.Add("-------------------------------");
                    }
                    class2.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i < 30 && i > 19)
                {
                    if (i == 20)
                    {
                        class3.Add("-------------------------------");
                        class3.Add("TOPIC: ITALY");
                        class3.Add("-------------------------------");
                    }
                    class3.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i < 40 && i > 29)
                {
                    if (i == 30)
                    {
                        class4.Add("-------------------------------");
                        class4.Add("TOPIC: FOOD");
                        class4.Add("-------------------------------");
                    }
                    class4.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i < 50 && i > 39)
                {
                    if (i == 40)
                    {
                        class5.Add("-------------------------------");
                        class5.Add("TOPIC: FASHION");
                        class5.Add("-------------------------------");
                    }
                    class5.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i < 60 && i > 49)
                {
                    if (i == 50)
                    {
                        class6.Add("-------------------------------");
                        class6.Add("TOPIC: FOOTBALL");
                        class6.Add("-------------------------------");
                    }
                    class6.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i < 140 && i > 59)
                {
                    if (i == 60)
                    {
                        class7.Add("-------------------------------");
                        class7.Add("TOPIC: OTHER");
                        class7.Add("-------------------------------");
                    }
                    class7.Add("Training_Tweet:\t" + documents_Train[i]);
                }
                if (i >= 140)
                {
                    int what;
                    what = outputValues[i - 140].IndexOf(outputValues[i - 140].Max());
                    switch (what)
                    {
                    case 0:
                        class1.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;

                    case 1:
                        class2.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;

                    case 2:
                        class3.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;

                    case 3:
                        class4.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;

                    case 4:
                        class5.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;

                    case 5:
                        class6.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;

                    case 6:
                        class7.Add("Test_Tweet:\t" + documents_Train[i]);
                        break;
                    }
                }
            }

            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class1);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class2);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class3);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class4);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class5);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class6);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");
            outputLines.AddRange(class7);
            outputLines.Add("");
            outputLines.Add("");
            outputLines.Add("");


            System.IO.File.WriteAllLines(@"Train_NN_With_Test_2.txt", outputLines.ToArray());

            Console.Write("Press any key to quit ..");
#endif

            Console.ReadKey();
        }
Example #28
0
        public void KMeansMoreClustersThanSamples()
        {
            Accord.Math.Tools.SetupGenerator(0);


            // Declare some observations
            double[][] observations = 
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            double[][] orig = observations.MemberwiseClone();

            KMeans kmeans = new KMeans(15);

            bool thrown = false;

            try
            {
                int[] labels = kmeans.Compute(observations);
            }
            catch (ArgumentException)
            {
                thrown = true;
            }

            Assert.IsTrue(thrown);
        }
Example #29
0
        public void Test_TrainPartials()
        {
            double[][] clusterCenters = new double[3][];
            clusterCenters[0] = new double[] { 5.0, 5.0 };
            clusterCenters[1] = new double[] { 15.0, 15.0 };
            clusterCenters[2] = new double[] { 30.0, 30.0 };

            double[][] clusterCenters2 = new double[3][];
            clusterCenters2[0] = new double[] { 6, 5 };
            clusterCenters2[1] = new double[] { 17, 18 };
            clusterCenters2[2] = new double[] { 28, 30 };

            string[] attributes = new string[] { "Height", "Weight" };

            int numAttributes = attributes.Length; // 2 in this demo (height,weight)
            int numClusters   = 3;                 // vary this to experiment (must be between 2 and number data tuples)
            int maxCount      = 300;               // trial and error

            double[][] apiResp1Centroid    = new double[numClusters][];
            double[]   apiResp1MaxDistance = new double[numClusters];
            double[]   apiResp1NumSamples  = new double[numClusters];

            ClusteringSettings settings = new ClusteringSettings(maxCount, numClusters, numAttributes, KmeansAlgorithm: 2);

            // Creates learning api object
            LearningApi api  = new LearningApi(loadDescriptor());
            LearningApi api2 = new LearningApi(loadDescriptor());

            double[][] rawData  = Helpers.CreateSampleData(clusterCenters, 2, 10000, 0.5);
            double[][] rawData2 = Helpers.CreateSampleData(clusterCenters2, 2, 5000, 0.5);

            int runNum = 0;

            api.UseActionModule <object, double[][]>((data, ctx) =>
            {
                if (runNum == 0)
                {
                    return(rawData);
                }
                else
                {
                    return(rawData2);
                }
            });

            api2.UseActionModule <object, double[][]>((data, ctx) =>
            {
                return(rawData2);
            });

            // start api2 that runs only second raw data (rawData2)
            api2.UseKMeans(settings);

            // train
            var api2Resp = api2.Run() as KMeansScore;

            Assert.True(api2Resp.Model.Clusters != null);
            Assert.True(api2Resp.Model.Clusters.Length == clusterCenters.Length);

            // start api that runs first raw data (rawData) and save results in variables
            api.UseKMeans(settings);

            // train
            var apiResp = api.Run() as KMeansScore;

            Assert.True(apiResp.Model.Clusters != null);
            Assert.True(apiResp.Model.Clusters.Length == clusterCenters.Length);

            // save first run results in variables
            for (int i = 0; i < numClusters; i++)
            {
                apiResp1Centroid[i]    = apiResp.Model.Clusters[i].Centroid;
                apiResp1MaxDistance[i] = apiResp.Model.Clusters[i].InClusterMaxDistance;
                apiResp1NumSamples[i]  = apiResp.Model.Clusters[i].NumberOfSamples;
            }


            /// run with new data
            runNum++;

            // continue partial api run using second raw data (rawData2)
            settings = new ClusteringSettings(maxCount, numClusters, numAttributes, KmeansAlgorithm: 2, initialCentroids: apiResp1Centroid);

            // train
            apiResp = api.Run() as KMeansScore;

            Assert.True(apiResp.Model.Clusters != null);
            Assert.True(apiResp.Model.Clusters.Length == clusterCenters.Length);

            //// compare results

            double f, res;

            for (int i = 0; i < numClusters; i++)
            {
                // partial formula f*res
                f = (double)1 / apiResp.Model.Clusters[i].NumberOfSamples;
                for (int j = 0; j < numAttributes; j++)
                {
                    res = apiResp1Centroid[i][j] * apiResp1NumSamples[i] + api2Resp.Model.Clusters[i].Centroid[j] * api2Resp.Model.Clusters[i].NumberOfSamples;
                    // partial centroid check
                    Assert.True(apiResp.Model.Clusters[i].Centroid[j] == f * res);
                }
                // max distance in cluster check
                Assert.True(apiResp.Model.Clusters[i].InClusterMaxDistance >= apiResp1MaxDistance[i] + KMeans.calculateDistance(apiResp1Centroid[i], apiResp.Model.Clusters[i].Centroid));
            }
        }
Example #30
0
        public void dayWorkSchedule(DateTime date)
        {
            Func <WorkSchedule, bool> predicat        = (w => w.workSchedule_date == date);
            List <WorkSchedule>       workSchedules   = selectWorkSchedule(predicat);
            List <Distributors>       alldistributors = new List <Distributors>();
            List <Distributors>       ezerList        = new List <Distributors>();

            foreach (WorkSchedule item in workSchedules)
            {
                ezerList = selectDistributors(d => d.distributors_id == item.distributor_id);
                if (ezerList.Count != 1)
                {
                    throw new Exception("שגיאה בחיפוש אחרי מחלק זה");
                }
                alldistributors.Add(ezerList[0]);
            }

            List <Recipients> allrecipients = recipientsPackageByDay(date);

            double[][] Coordinates = new double[allrecipients.Count][];
            int        i           = 0;

            foreach (Recipients item in allrecipients)
            {
                Coordinates[i] = getLatLongFromAddress(item.recipients_address);
                i++;
            }

            // Create a new K-Means algorithm with 3 clusters
            KMeans kmeans = new KMeans(3);

            // Compute the algorithm, retrieving an integer array
            //  containing the labels for each of the observations
            KMeansClusterCollection clusters = kmeans.Learn(Coordinates);

            // As a result, the first two observations should belong to the
            //  same cluster (thus having the same label). The same should
            //  happen to the next four observations and to the last three.
            int[] labels = clusters.Decide(Coordinates);

            List <Recipients> group0 = new List <Recipients>();
            List <Recipients> group1 = new List <Recipients>();
            List <Recipients> group2 = new List <Recipients>();

            for (int k = 0; k < labels.Length; k++)
            {
                if (labels[k] == 0)
                {
                    group0.Add(allrecipients[k]);
                }
                if (labels[k] == 1)
                {
                    group1.Add(allrecipients[k]);
                }
                if (labels[k] == 2)
                {
                    group2.Add(allrecipients[k]);
                }
            }

            double lat = 0; double lon = 0;

            double[] d0 = new double[2];
            double[] d1 = new double[2];
            double[] d2 = new double[2];
            foreach (var item in group0)
            {
                d0   = getLatLongFromAddress(item.recipients_address);
                lat += d0[0];
                lon += d0[1];
            }
            d0[0] = lat / group0.Count;
            d0[1] = lon / group0.Count;
            lat   = 0; lon = 0;
            foreach (var item in group1)
            {
                d1   = getLatLongFromAddress(item.recipients_address);
                lat += d1[0];
                lon += d1[1];
            }
            d1[0] = lat / group1.Count;
            d1[1] = lon / group1.Count;
            lat   = 0; lon = 0;
            foreach (var item in group2)
            {
                d2   = getLatLongFromAddress(item.recipients_address);
                lat += d2[0];
                lon += d2[1];
            }
            d2[0] = lat / group2.Count;
            d2[1] = lon / group2.Count;
            // double[] d0 = getLatLongFromAddress(group0[0].recipients_address);
            // double[] d1 = getLatLongFromAddress(group1[0].recipients_address);
            // double[] d2 = getLatLongFromAddress(group2[0].recipients_address);

            double[,] distance = new double[3, 3];
            for (i = 0; i < 3; i++)
            {
                double[] d3 = getLatLongFromAddress(alldistributors[i].distributors_address);
                for (int j = 0; j < 3; j++)
                {
                    if (j == 0)
                    {
                        distance[i, j] = dalImp.addressCalculations.calculateDistance(d0, d3);
                    }
                    if (j == 1)
                    {
                        distance[i, j] = dalImp.addressCalculations.calculateDistance(d1, d3);
                    }
                    if (j == 2)
                    {
                        distance[i, j] = dalImp.addressCalculations.calculateDistance(d2, d3);
                    }
                }
            }
            int [,] minIndex = new int[3, 3];
            for (i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    minIndex[i, j] = findMinDist(distance[i, 0], distance[i, 1], distance[i, 2], j);
                }
            }

            if ((minIndex[0, 0] != minIndex[2, 0]) && (minIndex[0, 0] != minIndex[1, 0]) && (minIndex[2, 0] != minIndex[1, 0]))
            {
                if (minIndex[0, 0] == 0)
                {
                    UpdateWorkSchedule(new WorkSchedule(alldistributors[0].distributors_id, date, group0));
                    if (minIndex[1, 0] == 1)
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[1].distributors_id, date, group1));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[2].distributors_id, date, group2));
                    }
                    else if (minIndex[1, 0] == 2)
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[1].distributors_id, date, group2));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[2].distributors_id, date, group1));
                    }
                }
                else if (minIndex[0, 0] == 1)
                {
                    UpdateWorkSchedule(new WorkSchedule(alldistributors[0].distributors_id, date, group1));
                    if (minIndex[1, 0] == 0)
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[1].distributors_id, date, group0));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[2].distributors_id, date, group2));
                    }
                    else if (minIndex[1, 0] == 2)
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[1].distributors_id, date, group2));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[2].distributors_id, date, group0));
                    }
                }
                else if (minIndex[0, 0] == 2)
                {
                    UpdateWorkSchedule(new WorkSchedule(alldistributors[0].distributors_id, date, group2));
                    if (minIndex[1, 0] == 0)
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[1].distributors_id, date, group0));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[2].distributors_id, date, group1));
                    }
                    else if (minIndex[1, 0] == 1)
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[1].distributors_id, date, group1));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[2].distributors_id, date, group0));
                    }
                }
            }
            else
            {
                if ((minIndex[0, 0] == minIndex[2, 0]) && (minIndex[0, 0] == minIndex[1, 0]) && (minIndex[2, 0] == minIndex[1, 0]))
                {
                    UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[0, 0]].distributors_id, date, group0));
                    if ((minIndex[1, 1] == minIndex[2, 1]))
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[1, 1]].distributors_id, date, group1));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[2, 2]].distributors_id, date, group2));
                    }
                    else
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[1, 1]].distributors_id, date, group1));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[2, 1]].distributors_id, date, group2));
                    }
                }
                else
                {
                    int place;
                    if (minIndex[1, 0] == minIndex[2, 0])
                    {
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[0, 0]].distributors_id, date, group0));
                        place = minIndex[1, 1] + minIndex[1, 1] % 3;
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[1, 0]].distributors_id, date, group1));
                        UpdateWorkSchedule(new WorkSchedule(alldistributors[place].distributors_id, date, group2));
                    }
                    else
                    {
                        if (minIndex[0, 0] == minIndex[2, 0])
                        {
                            UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[1, 0]].distributors_id, date, group1));
                            place = minIndex[0, 0] + minIndex[1, 0] % 3;
                            UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[0, 0]].distributors_id, date, group1));
                            UpdateWorkSchedule(new WorkSchedule(alldistributors[place].distributors_id, date, group2));
                        }
                        else
                        {
                            UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[2, 0]].distributors_id, date, group2));
                            place = minIndex[0, 0] + minIndex[2, 0] % 3;
                            UpdateWorkSchedule(new WorkSchedule(alldistributors[minIndex[1, 1]].distributors_id, date, group0));
                            UpdateWorkSchedule(new WorkSchedule(alldistributors[place].distributors_id, date, group1));
                        }
                    }
                }
            }
        }
Example #31
0
        public void learn_test_weights()
        {
            #region doc_learn_weights
            Accord.Math.Random.Generator.Seed = 0;

            // A common desire when doing clustering is to attempt to find how to
            // weight the different components / columns of a dataset, giving them
            // different importances depending on the end goal of the clustering task.

            // Declare some observations
            double[][] observations =
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            // Create a new K-Means algorithm
            KMeans kmeans = new KMeans(k: 3)
            {
                // For example, let's say we would like to consider the importance of
                // the first column as 0.1, the second column as 0.7 and the third 0.9
                Distance = new WeightedSquareEuclidean(new double[] { 0.1, 0.7, 1.1 })
            };

            // Compute and retrieve the data centroids
            var clusters = kmeans.Learn(observations);

            // Use the centroids to parition all the data
            int[] labels = clusters.Decide(observations);
            #endregion

            Assert.AreEqual(labels[0], labels[2]);

            Assert.AreEqual(labels[0], labels[2]);
            Assert.AreEqual(labels[0], labels[3]);
            Assert.AreEqual(labels[0], labels[4]);
            Assert.AreEqual(labels[0], labels[4]);

            Assert.AreEqual(labels[6], labels[7]);
            Assert.AreEqual(labels[6], labels[8]);

            Assert.AreNotEqual(labels[0], labels[1]);
            Assert.AreNotEqual(labels[2], labels[6]);
            Assert.AreNotEqual(labels[0], labels[6]);

            int[] labels2 = kmeans.Clusters.Decide(observations);
            Assert.IsTrue(labels.IsEqual(labels2));

            var c = new KMeansClusterCollection.KMeansCluster[clusters.Count];
            int i = 0;
            foreach (var cluster in clusters)
            {
                c[i++] = cluster;
            }

            for (i = 0; i < c.Length; i++)
            {
                Assert.AreSame(c[i], clusters[i]);
            }
        }
Example #32
0
        public void DeserializationTest1()
        {

            MemoryStream stream = new MemoryStream(Properties.Resources.kmeans);

            BinaryFormatter bf = new BinaryFormatter();
            object o = bf.DeserializeAnyVersion(stream);

            KMeans kmeans = (KMeans)o;


            KMeans kbase = new KMeans(3);

            Assert.AreEqual(kbase.Iterations, kmeans.Iterations);
            Assert.AreEqual(kbase.MaxIterations, kmeans.MaxIterations);
            Assert.AreEqual(kbase.Tolerance, kmeans.Tolerance);

            Assert.AreEqual(kbase.UseCentroidSeeding, kmeans.UseCentroidSeeding);
            Assert.AreEqual(kbase.ComputeInformation, kmeans.ComputeInformation);

            Assert.AreEqual(kbase.Distance, kmeans.Distance);
        }
Example #33
0
        private Image <Bgr, Byte> kmeans()
        {
            int            trainSampleCount = 1500;
            int            sigma            = 60;
            Matrix <float> trainData        = new Matrix <float>(trainSampleCount, 2);
            Matrix <float> trainData1       = trainData.GetRows(0, trainSampleCount / 3, 1);

            trainData1.GetCols(0, 1).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
            trainData1.GetCols(1, 2).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));

            Matrix <float> trainData2 = trainData.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);

            trainData2.SetRandNormal(new MCvScalar(400), new MCvScalar(sigma));

            Matrix <float> trainData3 = trainData.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);

            trainData3.GetCols(0, 1).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
            trainData3.GetCols(1, 2).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));

            PointF[] points = new PointF[trainSampleCount];
            for (int i = 0; i < points.Length; ++i)
            {
                points[i] = new PointF(trainData[i, 0], trainData[i, 1]);
            }
            var km = new KMeans <PointF>(points, 3,
                                         (a, b) => ((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y)),
                                         list => new PointF(list.Average(p => p.X), list.Average(p => p.Y))
                                         );
            int     it    = 0;
            MyTimer timer = new MyTimer();

            timer.Restart();
            //var cluster = km.Cluster();
            var cluster = km.AnnealCluster(
                (a, b) => new PointF(a.X + b.X, a.Y + b.Y),
                (a, b) => new PointF(a.X - b.X, a.Y - b.Y),
                (p, v) => new PointF((float)(p.X / v), (float)(p.Y / v)),
                out it);
            var time = timer.Stop();

            this.Text = String.Format("n={0}, k={1}, time={2}ms, iter={3}.", trainSampleCount, 3, time, it);

            Image <Bgr, Byte> img = new Image <Bgr, byte>(500, 500);

            for (int y = 0; y < 500; ++y)
            {
                for (int x = 0; x < 500; ++x)
                {
                    double d0 = (x - cluster[0].Center.X) * (x - cluster[0].Center.X)
                                + (y - cluster[0].Center.Y) * (y - cluster[0].Center.Y);
                    double d1 = (x - cluster[1].Center.X) * (x - cluster[1].Center.X)
                                + (y - cluster[1].Center.Y) * (y - cluster[1].Center.Y);
                    double d2 = (x - cluster[2].Center.X) * (x - cluster[2].Center.X)
                                + (y - cluster[2].Center.Y) * (y - cluster[2].Center.Y);
                    Bgr color = new Bgr(0, 0, 0);
                    if (d0 < d1 && d0 < d2)
                    {
                        color = new Bgr(20, 0, 0);
                    }
                    if (d1 < d0 && d1 < d2)
                    {
                        color = new Bgr(0, 20, 0);
                    }
                    if (d2 < d0 && d2 < d1)
                    {
                        color = new Bgr(0, 0, 20);
                    }
                    img[y, x] = color;
                }
            }
            Bgr[] colors  = new[] { new Bgr(128, 0, 0), new Bgr(0, 128, 0), new Bgr(0, 0, 128) };
            Bgr[] centers = new[] { new Bgr(255, 0, 0), new Bgr(0, 255, 0), new Bgr(0, 0, 255) };
            for (int i = 0; i < 3; ++i)
            {
                foreach (var p in cluster[i])
                {
                    img.Draw(new CircleF(p, 2), colors[i], 1);
                }
                img.Draw(new CircleF(cluster[i].Center, 5), centers[i], 3);
            }
            img.Draw(new CircleF(new PointF(100, 300), sigma), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(100, 300), 3), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(300, 100), sigma), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(300, 100), 3), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(400, 400), sigma), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(400, 400), 3), new Bgr(128, 128, 128), 2);

            return(img);
        }
        private List<String> GetSimilaresDatabaseKmeans(List<Double> descriptoresEntrada)
        {
            ModeloSimilitudEntities db = new ModeloSimilitudEntities();
            List<canciones> ListaCanciones = db.canciones.ToList();
            Double[] vectorEntrada = descriptoresEntrada.ToArray();
            vectorEntrada = Normalizar(vectorEntrada);
            Double[][] matriz = csvtoMatrix("descriptoresNormalizados");
            int Nclusters = 7;
            KMeans kmeans = new KMeans(Nclusters, Accord.Math.Distance.Chebyshev);
            int[] indices = kmeans.Compute(matriz);
            int Cluster =kmeans.Nearest(vectorEntrada);

            int nroSimilares = 10;
            int[] indiceSimilar=new int[nroSimilares];

            for(int j=0;j<nroSimilares;j++){
                Double distancia = 1000;
                for (int i = 0; i < indices.Length; i++)
                {
                    if (!indiceSimilar.Contains(i))
                    {
                        if (Cluster == indices[i])
                        {
                            Double distanciatemp = Accord.Math.Distance.Chebyshev(vectorEntrada, matriz[i]);
                            if (distanciatemp < distancia)
                            {
                                distancia = distanciatemp;
                                indiceSimilar[j] = i;
                            }
                        }
                    }
                }
            }

            List<String> listaSimilares = new List<String>();
            foreach (int i in indiceSimilar)
            {
                listaSimilares.Add(ListaCanciones[i].id_spotify.Substring(14));
            }

            //string select="select * from canciones where energy={0} and liveness={1} and tempo={2} and speechiness={3} and acousticness={4} and loudness={5} and valence={6} and danceability={7} and instrumentalness={8} and key={9}";
            //string select2 = "select * from canciones";
            //for(int j=0;j<cercanos.Length;j++){
            //    object[] parameters = new object[10];
            //    for (int i = 0; i < 10; i++)
            //    {
            //            SqlParameter param = new SqlParameter("i", cercanos[j][i]);
            //            parameters[i] = cercanos[j][i];
            //        }
            //        var stores = db.Database.SqlQuery<canciones>(select, parameters).ToList();
            //        listaSimilares.Add(stores[0].id_spotify);
            //}

            return listaSimilares;
        }
        public void buildModel(string modelPath)
        {
            outmodelpath = modelPath;
            using (System.IO.StreamReader sr = new System.IO.StreamReader(outmodelpath))
            {
                dataPrepBase.modelTypes mType = (dataPrepBase.modelTypes)Enum.Parse(typeof(dataPrepBase.modelTypes), sr.ReadLine());
                if (mType != dataPrepBase.modelTypes.StrataCovCorr)
                {

                    System.Windows.Forms.MessageBox.Show("Not a StrataCovCorr Model!!", "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                    return;
                }
                inpath = sr.ReadLine();
                VariableFieldNames = sr.ReadLine().Split(new char[] { ',' });
                n = System.Convert.ToInt32(sr.ReadLine());
                prop = System.Convert.ToDouble(sr.ReadLine());
                k = System.Convert.ToInt32(sr.ReadLine());
                lbl = sr.ReadLine().Split(new char[] { ',' }).ToList();
                kmeans = new KMeans(k);
                KMeansClusterCollection kmeansColl = kmeans.Clusters;
                for (int i = 0; i < k; i++)
                {
                    double[] mns = (from s in (sr.ReadLine().Split(new char[] { ',' })) select System.Convert.ToDouble(s)).ToArray();
                    string[] covVlsStr = sr.ReadLine().Split(new char[] { ',' });
                    double p = System.Convert.ToDouble(sr.ReadLine());
                    double[,] cov = new double[VariableFieldNames.Length, VariableFieldNames.Length];
                    for (int j = 0; j < VariableFieldNames.Length; j++)
                    {
                        for (int l = 0; l < VariableFieldNames.Length; l++)
                        {
                            int indexVl = (j * VariableFieldNames.Length) + l;
                            cov[l, j] = System.Convert.ToDouble(covVlsStr[indexVl]);
                        }
                    }

                    KMeansCluster kc = new KMeansCluster(kmeansColl, i);
                    kc.Mean = mns;
                    kc.Covariance = cov;
                    kc.Proportion = p;
                }
                sr.Close();
            }
        }
Example #36
0
        private void bClus_Click(object sender, RoutedEventArgs e)
        {
            int k  = Int16.Parse(kKmeans.Text);
            int nB = classPoints[false].Count;
            int nR = classPoints[true].Count;

            if (nR + nB < 1)
            {
                textBlock.Text = "No dots.";
                return;
            }
            if (k < 1)
            {
                textBlock.Text = "Number of classes must be > 0.";
                return;
            }

            double[][] inputs = new double[nB + nR][];

            int i = 0;

            foreach (System.Windows.Point p in classPoints[false])
            {
                inputs[i++] = new double[] { p.X, p.Y };
            }

            foreach (System.Windows.Point p in classPoints[true])
            {
                inputs[i++] = new double[] { p.X, p.Y };
            }

            KMeans kmeans = new KMeans(k: k);

            var clusters = kmeans.Learn(inputs);

            int[] labels = clusters.Decide(inputs);

            var centroids = clusters.Centroids;

            for (int j = 0; j < k; ++j)
            {
                Ellipse dot = new Ellipse();
                dot.Width           = 11;
                dot.Height          = 11;
                dot.StrokeThickness = 2;
                dot.Fill            = blackBrush;
                Canvas.SetTop(dot, centroids[j][1] - 5);
                Canvas.SetLeft(dot, centroids[j][0] - 5);

                cvsML.Children.Add(dot);

                double max = 0;

                for (int z = 0; z < labels.Length; ++z)
                {
                    if (labels[z] == j)
                    {
                        double d = Math.Sqrt(Math.Pow(centroids[j][0] - inputs[z][0], 2) + Math.Pow(centroids[j][1] - inputs[z][1], 2));
                        if (d > max)
                        {
                            max = d;
                        }
                    }
                }

                Ellipse circle = new Ellipse();
                circle.Width           = 2 * max + 10;
                circle.Height          = 2 * max + 10;
                circle.StrokeThickness = 2;
                circle.Stroke          = blackBrush;
                Canvas.SetTop(circle, centroids[j][1] - max - 5);
                Canvas.SetLeft(circle, centroids[j][0] - max - 5);

                cvsML.Children.Add(circle);
            }
        }
Example #37
0
        /// <summary>
        /// Train on number of clusters using gap statistic
        /// </summary>
        private async Task ComputeK(int maxK = 100, int B = 10, int driverID = 0, DateTime?startDate = null, DateTime?endDate = null)
        {
            double[]   Wk      = new double[maxK];
            double[][] Wref_kb = new double[maxK][];
            double[]   Gap     = new double[maxK];
            double[]   sd      = new double[maxK];

            KMeansClusterCollection[] clusterCollections = new KMeansClusterCollection[maxK];

            // obtain dataset
            IEnumerable <Leg> legs = driverID == 0 ? await _legRepository.ListAsync()
                : await _legRepository.ListForDriverAsync(driverID);

            if (startDate == null)
            {
                startDate = DateTime.MinValue;
            }
            if (endDate == null)
            {
                endDate = DateTime.MaxValue;
            }
            legs = legs.Where(leg => leg.StartTime.CompareTo(startDate) >= 0 && leg.StartTime.CompareTo(endDate) < 0);
            double[][] dataset = GetDataset(legs);

            // first cluster the dataset varying K
            for (int k = 1; k <= maxK; k++)
            {
                KMeans kMeans = new KMeans(k)
                {
                    // distance function for geographic coordinates
                    Distance = new GeographicDistance()
                };

                clusterCollections[k - 1] = kMeans.Learn(dataset);
                double[][][] clusterData = ClusterPoints(dataset, k, clusterCollections[k - 1]);

                // sum of pairwise distances
                Wk[k - 1] = ComputeWk(clusterData, clusterCollections[k - 1]);
            }

            // then generate the reference data sets
            double[] lowerBounds   = new double[4];
            double[] boxDimensions = new double[4];
            for (int i = 0; i < 4; i++)
            {
                lowerBounds[i]   = dataset.Select(l => l[i]).Min();
                boxDimensions[i] = dataset.Select(l => l[i]).Max() - lowerBounds[i];
            }
            CorrectLongitudeBounds(lowerBounds, boxDimensions, 1);
            CorrectLongitudeBounds(lowerBounds, boxDimensions, 3);

            Random random = new Random();

            for (int k = 1; k <= maxK; k++)
            {
                Wref_kb[k - 1] = new double[B];
                for (int c = 0; c < B; c++)
                {
                    double[][] refDataset = new double[dataset.Length][];
                    for (int i = 0; i < refDataset.Length; i++)
                    {
                        double[] dataPoint = new double[4];
                        for (int j = 0; j < 4; j++)
                        {
                            dataPoint[j] = random.NextDouble() * boxDimensions[j] + lowerBounds[j];
                            if ((j == 1 || j == 3) && dataPoint[j] > 180)
                            {
                                dataPoint[j] -= 360;
                            }
                        }
                        refDataset[i] = dataPoint;
                    }

                    // cluster reference dataset
                    KMeans refKmeans = new KMeans(k);
                    refKmeans.Distance = new GeographicDistance();
                    KMeansClusterCollection refClusters = refKmeans.Learn(refDataset);

                    // points in each cluster
                    double[][][] refClusterData = ClusterPoints(refDataset, k, refClusters);

                    // compute pairwise distance sum for refDataset
                    Wref_kb[k - 1][c] = ComputeWk(refClusterData, refClusters);
                }

                // compute gap statistic
                double l_avg = Wref_kb[k - 1].Select(x => Log(x)).Average();
                Gap[k - 1] = l_avg - Log(Wk[k - 1]);
                sd[k - 1]  = Sqrt(Wref_kb[k - 1].Select(x => (Log(x) - l_avg) * (Log(x) - l_avg)).Average());

                // decide optimal k
                if (k > 1 && Gap[k - 2] >= Gap[k - 1] - sd[k - 1])
                {
                    ClusterCollection           = clusterCollections[k - 2];
                    NumberOfClustersLastChanged = DateTime.Now;
                    return;
                }
            }
        }
Example #38
0
        public void KMeansConstructorTest2()
        {

            Accord.Math.Tools.SetupGenerator(0);


            // Declare some observations
            double[][] observations = 
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            double error, e;

            // Create a new algorithm
            KMeans kmeans = new KMeans(3);
            kmeans.Randomize(observations);

            // Save the first initialization
            double[][] initial = kmeans.Clusters.Centroids;

            // Compute the first K-Means
            kmeans.Compute(observations, out error);

            // Create more K-Means algorithms 
            //  with the same initializations
            for (int i = 0; i < 1000; i++)
            {
                kmeans = new KMeans(3);
                kmeans.Clusters.Centroids = initial;
                kmeans.Compute(observations, out e);

                Assert.AreEqual(error, e);
            }

            // Create more K-Means algorithms 
            //  without the same initialization
            bool differ = false;
            for (int i = 0; i < 1000; i++)
            {
                kmeans = new KMeans(3);
                kmeans.Compute(observations, out e);

                if (error != e) differ = true;
            }

            Assert.IsTrue(differ);
        }
 public void initKMeans()
 {
     KMeans.createRandomCenters(weightsByCreature);
     Debug.Log("initializing KMeans");
 }
        public override Structuring BuildStructuring()
        {
            if (Structurings == null || Set == null)
            {
                throw new NullReferenceException();
            }

            if (IContainerProgressBar != null)
            {
                IContainerProgressBar.ResetProgressBar(1, 1, true);
                IContainerProgressBar.UpdateProgressBar(0, "Running QMI algorithm...", true);
            }

            List <Attribute> list_att = new List <Attribute>();
            int cont = 0;

            foreach (Structuring s in Structurings)
            {
                foreach (Cluster c in s.Clusters.Values)
                {
                    Attribute att = new Attribute("x" + cont, null);
                    cont++;

                    att.AttributeType = AttributeType.Numeric;
                    list_att.Add(att);
                }
            }

            Set newset = new Set("Artificial");

            newset.Attributes  = new Attributes(list_att);
            newset.ElementType = ElementType.Numeric;


            foreach (Element e in Set.Elements)
            {
                List <object> values = new List <object>();
                foreach (Structuring s in Structurings)
                {
                    foreach (Cluster c in s.Clusters.Values)
                    {
                        double temp = c.HaveElement(e) ? 1 : 0;
                        temp = temp - ((double)c.ElementsCount / (double)Set.ElementsCount);
                        values.Add(temp);
                    }
                }
                Element newelement = new Element(newset, values);
                newelement.Name  = e.Name;
                newelement.Index = e.Index;

                newset.AddElement(newelement);
            }

            KMeans kms = new KMeans(newset, new EuclideanDistance()
            {
                AttributesToCalculateProximity = newset.Attributes.Values
            });

            kms.ClustersCount   = ClusterCount;
            kms.IterationsCount = IterationsCount;
            kms.Seed            = Environment.TickCount;

            kms.IContainerProgressBar = IContainerProgressBar;

            Structuring art_struct = kms.BuildStructuring();

            List <Cluster> clusters = new List <Cluster>();

            cont = 0;
            foreach (Cluster c in art_struct.Clusters.Values)
            {
                Cluster temp = new Cluster("C-" + cont);
                cont++;
                foreach (Element item in c.Elements)
                {
                    temp.AddElement(Set[item.Index]);
                }
                clusters.Add(temp);
            }

            Dictionary <string, Cluster> temp_dic = new Dictionary <string, Cluster>();

            foreach (Cluster item in clusters)
            {
                temp_dic.Add(item.Name, item);
            }

            Structuring real_struct = new Partition()
            {
                Clusters = temp_dic
            };

            return(real_struct);
        }
 public void updateColors()
 {
     updateWeightsByCreature();
     Debug.Log("updating colors");
     KMeans.setColors(weightsByCreature, creatures);
 }
Example #42
0
 private static float[] PrepareVector(KMeans kmeans, IVectorPack <float> x, CancellationToken cancellationToken)
 {
     return(kmeans.Transform(x, null, false, null, cancellationToken));
 }
Example #43
0
        public void Test_IncrementalMeanAverageSet()
        {
            for (int numOfSamples = 100; numOfSamples < 150000; numOfSamples += 15000)
            {
                // Test samples.
                double[][] data = new double[numOfSamples][];

                // Each sample belongs to some cluster.
                int[] clustering = new int[data.Length];

                for (int i = 0; i < numOfSamples; i++)
                {
                    data[i]       = new double[] { i };
                    clustering[i] = 0; // We have a single cluster. Every sample belongs to that cluster.
                }

                double[][] means = new double[1][];
                means[0] = new double[] { 0 };

                KMeans.updateMeans(data, clustering, means);

                // Mean of numOfSamples
                var mean = means[0][0];

                data = new double[numOfSamples / 2][];

                // Each sample belongs to some cluster.
                clustering = new int[data.Length];

                for (int i = 0; i < numOfSamples / 2; i++)
                {
                    data[i]       = new double[] { i };
                    clustering[i] = 0; // We have a single cluster. Every sample belongs to that cluster.
                }

                // Calculate mean of numOfSamples/2
                KMeans.updateMeans(data, clustering, means, 0, new double[] { 0 });
                // Mean of numOfSamples/2
                var mean1 = means[0][0];

                data = new double[numOfSamples / 2][];

                // Each sample belongs to some cluster.
                clustering = new int[data.Length];

                for (int i = 0; i < numOfSamples / 2; i++)
                {
                    data[i]       = new double[] { i + (numOfSamples / 2) };
                    clustering[i] = 0; // We have a single cluster. Every sample belongs to that cluster.
                }

                KMeans.updateMeans(data, clustering, means, numOfSamples / 2, new double[] { mean1 });

                // Mean for numbers from numOfSamples/2 to numOfSamples
                var mean2 = means[0][0];

                // M1 = mean of numOfSamples/2 (minibatch 1)
                // M2 = mean for numbers from numOfSamples/2 to numOfSamples (minibatch 2)
                // mean is batch for numbers from 1 to numOfSamples
                // (1/q1+q2)[q1*M1+q2*M2]
                // where q1 is number of elements inside of M1 and q2 number of elements inside of M2
                Assert.True(Math.Round(mean2, 2) == Math.Round(mean, 2));
            }
        }
 public void buildModel()
 {
     dataPrepStrata dStrat;
     if(InValueRaster==null)
     {
          dStrat = new dataPrepStrata(InTable, VariableFieldNames, StrataField);
     }
     else
     {
         dStrat = new dataPrepStrata(InValueRaster,InStrataRaster);
     }
     inpath = dStrat.InPath;
     n = dStrat.N;
     kmeans = dStrat.Model;
     lbl = dStrat.Labels;
     k = lbl.Count;
     prop = 1;
 }
Example #45
0
 public void KMeansConstructorTest3()
 {
     // Create a new algorithm
     KMeans kmeans = new KMeans(3);
     Assert.IsNotNull(kmeans.Clusters);
     Assert.IsNotNull(kmeans.Distance);
     Assert.IsNotNull(kmeans.Clusters.Centroids);
     Assert.IsNotNull(kmeans.Clusters.Count);
     Assert.IsNotNull(kmeans.Clusters.Covariances);
     Assert.IsNotNull(kmeans.Clusters.Proportions);
 }
Example #46
0
 internal static HandleRef getCPtr(KMeans obj)
 {
     return((obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr);
 }
Example #47
0
        public List <List <Instance> > FindClusters(InstanceModel model, List <Instance> instances, out List <IEmergingPattern> selectedPatterns)
        {
            NominalFeature     classFeature             = null;
            FeatureInformation backupFeatureInformation = null;

            string[] backupClassValues     = null;
            double[] backupClassByInstance = null;
            bool     isClassPresent        = true;

            if (model.ClassFeature() == null)
            {
                isClassPresent = false;
                classFeature   = new NominalFeature("class", model.Features.Length);
                var backupFeatures = model.Features;
                model.Features = new Feature[backupFeatures.Length + 1];
                for (int i = 0; i < backupFeatures.Length; i++)
                {
                    model.Features[i] = backupFeatures[i];
                }

                model.Features[backupFeatures.Length] = classFeature;
            }
            else
            {
                classFeature             = model.ClassFeature() as NominalFeature;
                backupFeatureInformation = classFeature.FeatureInformation;
                backupClassValues        = classFeature.Values;

                backupClassByInstance = new double[instances.Count];
                for (int i = 0; i < instances.Count; i++)
                {
                    backupClassByInstance[i]   = instances[i][classFeature];
                    instances[i][classFeature] = 0;
                }
            }

            classFeature.FeatureInformation = new NominalFeatureInformation()
            {
                Distribution     = new double[] { 1, 1, 1, 1, 1 },
                Ratio            = new double[] { 1, 1, 1, 1, 1 },
                ValueProbability = new double[] { 1, 1, 1, 1, 1 }
            };

            classFeature.Values = new string[1] {
                "Unknown"
            };

            var Miner = new UnsupervisedRandomForestMiner()
            {
                ClusterCount = ClusterCount, TreeCount = 100
            };

            var patterns = Miner.Mine(model, instances, classFeature);

            var instIdx = new Dictionary <Instance, int>();

            for (int i = 0; i < instances.Count; i++)
            {
                instIdx.Add(instances[i], i);
            }

            int[,] similarityMatrix = new int[instances.Count, instances.Count + 1];
            var coverSetByPattern = new Dictionary <IEmergingPattern, HashSet <Instance> >();

            foreach (var pattern in patterns)
            {
                if (pattern != null)
                {
                    var currentCluster  = new List <int>();
                    var currentCoverSet = new HashSet <Instance>();
                    for (int i = 0; i < instances.Count; i++)
                    {
                        if (pattern.IsMatch(instances[i]))
                        {
                            currentCluster.Add(i);
                            currentCoverSet.Add(instances[i]);
                        }
                    }

                    for (int i = 0; i < currentCluster.Count; i++)
                    {
                        for (int j = 0; j < currentCluster.Count; j++)
                        {
                            similarityMatrix[currentCluster[i], currentCluster[j]] += 1;
                            similarityMatrix[currentCluster[i], instances.Count]   += 1;
                        }
                    }

                    coverSetByPattern.Add(pattern, currentCoverSet);
                }
            }

            var kmeans = new KMeans()
            {
                K = ClusterCount, classFeature = classFeature, similarityMatrix = similarityMatrix, instIdx = instIdx
            };
            var clusterList = kmeans.FindClusters(instances);

            var patternClusterList = new List <List <IEmergingPattern> >();

            for (int i = 0; i < ClusterCount; i++)
            {
                patternClusterList.Add(new List <IEmergingPattern>());
            }

            foreach (var pattern in patterns)
            {
                if (pattern != null)
                {
                    var bestIdx       = 0;
                    var maxCoverCount = int.MinValue;
                    pattern.Supports = new double[ClusterCount];
                    pattern.Counts   = new double[ClusterCount];
                    HashSet <Instance> bestCover = null;
                    for (int i = 0; i < ClusterCount; i++)
                    {
                        HashSet <Instance> currentCover = new HashSet <Instance>(coverSetByPattern[pattern].Intersect(clusterList[i]));
                        var currentCoverCount           = currentCover.Count;
                        pattern.Counts[i]   = currentCoverCount;
                        pattern.Supports[i] = 1.0 * currentCoverCount / clusterList[i].Count;
                        if (currentCoverCount > maxCoverCount)
                        {
                            maxCoverCount = currentCoverCount;
                            bestIdx       = i;
                            bestCover     = currentCover;
                        }
                    }
                    coverSetByPattern[pattern] = bestCover;

                    patternClusterList[bestIdx].Add(pattern);
                }
            }

            selectedPatterns = FilterPatterns(instances, patternClusterList);

            if (isClassPresent)
            {
                classFeature.FeatureInformation = backupFeatureInformation;
                classFeature.Values             = backupClassValues;
                for (int i = 0; i < instances.Count; i++)
                {
                    instances[i][classFeature] = backupClassByInstance[i];
                }
            }

            return(clusterList);
        }
Example #48
0
        private Image<Bgr, Byte> kmeans()
        {
            int trainSampleCount = 1500;
            int sigma = 60;
            Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
            Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount / 3, 1);
            trainData1.GetCols(0, 1).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
            trainData1.GetCols(1, 2).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));

            Matrix<float> trainData2 = trainData.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
            trainData2.SetRandNormal(new MCvScalar(400), new MCvScalar(sigma));

            Matrix<float> trainData3 = trainData.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
            trainData3.GetCols(0, 1).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
            trainData3.GetCols(1, 2).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));

            PointF[] points = new PointF[trainSampleCount];
            for (int i = 0; i < points.Length; ++i) {
                points[i] = new PointF(trainData[i, 0], trainData[i, 1]);
            }
            var km = new KMeans<PointF>(points, 3,
                (a, b) => ((a.X - b.X) * (a.X - b.X) + (a.Y - b.Y) * (a.Y - b.Y)),
                list => new PointF(list.Average(p => p.X), list.Average(p => p.Y))
            );
            int it = 0;
            MyTimer timer = new MyTimer();
            timer.Restart();
            //var cluster = km.Cluster();
            var cluster = km.AnnealCluster(
                (a, b) => new PointF(a.X + b.X, a.Y + b.Y),
                (a, b) => new PointF(a.X - b.X, a.Y - b.Y),
                (p, v) => new PointF((float)(p.X / v), (float)(p.Y / v)),
                out it);
            var time = timer.Stop();
            this.Text = String.Format("n={0}, k={1}, time={2}ms, iter={3}.", trainSampleCount, 3, time, it);

            Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);
            for (int y = 0; y < 500; ++y) {
                for (int x = 0; x < 500; ++x) {
                    double d0 = (x - cluster[0].Center.X) * (x - cluster[0].Center.X)
                              + (y - cluster[0].Center.Y) * (y - cluster[0].Center.Y);
                    double d1 = (x - cluster[1].Center.X) * (x - cluster[1].Center.X)
                              + (y - cluster[1].Center.Y) * (y - cluster[1].Center.Y);
                    double d2 = (x - cluster[2].Center.X) * (x - cluster[2].Center.X)
                              + (y - cluster[2].Center.Y) * (y - cluster[2].Center.Y);
                    Bgr color = new Bgr(0, 0, 0);
                    if (d0 < d1 && d0 < d2) {
                        color = new Bgr(20, 0, 0);
                    }
                    if (d1 < d0 && d1 < d2) {
                        color = new Bgr(0, 20, 0);
                    }
                    if (d2 < d0 && d2 < d1) {
                        color = new Bgr(0, 0, 20);
                    }
                    img[y, x] = color;
                }
            }
            Bgr[] colors = new[] { new Bgr(128, 0, 0), new Bgr(0, 128, 0), new Bgr(0, 0, 128) };
            Bgr[] centers = new[] { new Bgr(255, 0, 0), new Bgr(0, 255, 0), new Bgr(0, 0, 255) };
            for (int i = 0; i < 3; ++i) {
                foreach (var p in cluster[i]) {
                    img.Draw(new CircleF(p, 2), colors[i], 1);
                }
                img.Draw(new CircleF(cluster[i].Center, 5), centers[i], 3);
            }
            img.Draw(new CircleF(new PointF(100, 300), sigma), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(100, 300), 3), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(300, 100), sigma), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(300, 100), 3), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(400, 400), sigma), new Bgr(128, 128, 128), 2);
            img.Draw(new CircleF(new PointF(400, 400), 3), new Bgr(128, 128, 128), 2);

            return img;
        }
Example #49
0
        private static void clusterSC()
        {
            int s = 100, K = 100;
            string[] templatefiles = Directory.GetFiles(@"D:\Play Data\my_template_data\sc\", "*.sc")
                .Take(180).ToArray();
            int templatecount = templatefiles.Length;
            #region 读取模板
            Debug("打开{0}个模板--------------------------------------------", templatecount);
            double[][] templates = new double[templatecount * s][];
            MyTimer timer = new MyTimer();
            timer.Restart();
            for (int i = 0; i < templatefiles.Length; ++i) {
                string file = templatefiles[i];
                string filename = Path.GetFileNameWithoutExtension(file);
                using (var fs = new FileStream(file, FileMode.Open)) {
                    using (var br = new BinaryReader(fs)) {
                        for (int j = 0; j < s; ++j) {
                            templates[i * s + j] = new double[60];
                            for (int k = 0; k < 60; ++k) {
                                templates[i * s + j][k] = br.ReadDouble();
                            }
                        }
                    }
                }
                if (i % 100 == 0)
                    Debug("已完成{0}个", i);
            }
            Debug("模板读取完成,用时{0}ms.", timer.Stop());
            #endregion

            #region 聚类
            timer.Restart();
            KMeans<double[]> kmeans = new KMeans<double[]>(templates, K,
                Jim.OCR.ShapeContext2D.ShapeContext.HistCost,
                scs => {
                    double[] scnew = new double[60];
                    for (int k = 0; k < 60; ++k) {
                        scnew[k] = scs.Average(sc => sc[k]);
                    }
                    return scnew;
                }
            );
            kmeans.MaxIterate = 100;
            var cluster = kmeans.Cluster();
            Debug("聚类完成,用时{0}ms.", timer.Stop());
            #endregion

            using (var fs = new FileStream(Path.Combine(@"D:\Play Data\my_template_data\sm-" + K, templatecount + ".sm"), FileMode.Create))
            {
                using (var bw = new BinaryWriter(fs)) {
                    for (int i = 0; i < K; ++i) {
                        for (int k = 0; k < 60; ++k) {
                            bw.Write(cluster[i].Center[k]);
                        }
                    }
                }
            }
        }
Example #50
0
        public void IndexFiles(FileInfo[] imageFiles, System.ComponentModel.BackgroundWorker IndexBgWorker,
            Action<string> logWriter,
            LocateSettings locateSetting = null)
        {
            //For Time Profilling
            long extractingTime, kMeanTime = 0, calcBagOfVisualTime = 0;
            Stopwatch sw1;

            SimpleSurfSift.LoCATe descriptorExtractor = new SimpleSurfSift.LoCATe();

            sw1 = Stopwatch.StartNew();
            logWriter("Index started, extracting Descriptors...");

            List<double[]> ListofDescriptorsForCookBook = new List<double[]>();
            List<LoCATeRecord> ListOfAllImageDescriptors = new List<LoCATeRecord>();

            int totalFileCount = imageFiles.Length;
            if (totalFileCount == 0)
            {
                logWriter("No files to index");
                return;
            };
            for (int i = 0; i < totalFileCount; i++)
            {
                var fi = imageFiles[i];

                using (Bitmap observerImage = (Bitmap)Image.FromFile(fi.FullName))
                {
                    List<double[]> locateDescriptors = descriptorExtractor.extract(observerImage, "SURF");
                    ListOfAllImageDescriptors.Add(new LoCATeRecord
                    {
                        Id = i,
                        ImageName = fi.Name,
                        ImagePath = fi.FullName,
                        LoCATeDescriptors = locateDescriptors
                    });
                    if (locateSetting.IsCodeBookNeedToBeCreated)
                    {
                        if (locateDescriptors.Count > 4)
                        {
                            RandomHelper randNumGenerator = new RandomHelper();
                            List<int> randIndexes = randNumGenerator.GetRandomNumberInRange(0, locateDescriptors.Count, 10d);
                            foreach (int index in randIndexes)
                            {
                                ListofDescriptorsForCookBook.Add(locateDescriptors[index]);
                            }
                        }
                        else
                        {
                            Debug.WriteLine(fi.Name + " skip from index, because it didn't have significant feature");
                        }
                    }

                }
                IndexBgWorker.ReportProgress(i);
            }
            sw1.Stop();
            extractingTime = Convert.ToInt32(sw1.Elapsed.TotalSeconds);
            double[][] codeBook = null;
            if (locateSetting.IsCodeBookNeedToBeCreated)
            {
                logWriter("Indexing, Calculating Mean...");
                sw1.Reset(); sw1.Start();
                KMeans kMeans = new KMeans(locateSetting.SizeOfCodeBook);
                kMeans.Compute(ListofDescriptorsForCookBook.ToArray());
                codeBook = kMeans.Clusters.Centroids;
                //------------Save CookBook
                string fullFileName = locateSetting.CodeBookFullPath;
                if (File.Exists(fullFileName))
                    File.Delete(fullFileName);
                using (FileStream fs = new FileStream(fullFileName, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                        = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    bf.Serialize(fs, codeBook);
                    fs.Close();
                }
                sw1.Stop();
                kMeanTime = Convert.ToInt32(sw1.Elapsed.TotalSeconds);
            }
            else
            {
                string fullFileName = locateSetting.CodeBookFullPath;
                if (!File.Exists(fullFileName))
                {
                    string msg = string.Format("Couldn't find {0}, Please Index before querying with Locate", fullFileName);
                    throw new InvalidOperationException(msg);
                }
                using (FileStream fs = new FileStream(fullFileName, FileMode.Open, FileAccess.Read, FileShare.None))
                {
                    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                        = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                    codeBook = (double[][])bf.Deserialize(fs);
                    fs.Close();
                }
            }

            logWriter("Indexing, Calculating Bag of Visual Words...");
            sw1.Reset(); sw1.Start();
            List<LoCaTeBoWRecord> ListOfImageVisualBagOfWorks = new List<LoCaTeBoWRecord>();
            for (int i = 0; i < ListOfAllImageDescriptors.Count; i++)
            {
                double[] visualWordForImage = createVisualWord(ListOfAllImageDescriptors[i].LoCATeDescriptors, codeBook);
                LoCaTeBoWRecord rec = new LoCaTeBoWRecord
                {
                    Id = ListOfAllImageDescriptors[i].Id,
                    ImageName = ListOfAllImageDescriptors[i].ImageName,
                    ImagePath = ListOfAllImageDescriptors[i].ImagePath,
                    VisaulWord = visualWordForImage
                };
                ListOfImageVisualBagOfWorks.Add(rec);
                IndexBgWorker.ReportProgress(i);
            }
            logWriter("Indexing, Calculating ltcData...");
            int[] histogramSumOfAllVisualWords = null;
            //------------Creating sum histogram of all words
            double[][] AllDatas = ListOfImageVisualBagOfWorks.Select(des => des.VisaulWord).ToArray();
            histogramSumOfAllVisualWords = createIndex((double[][])(AllDatas));
            //------------Creating Image Records Data
            LoCaTeDataSet locateDS = new LoCaTeDataSet
            {
                AllImageRecordSet = ListOfImageVisualBagOfWorks,
                HistogramSumOfAllVisualWords = histogramSumOfAllVisualWords
            };
            logWriter("Indexing, Saving Image Data...");
            //------------Save CookBook
            string ImageRecordName = Path.Combine(DirectoryHelper.SaveDirectoryPath, "LoCATeImageRecords.bin");
            if (File.Exists(ImageRecordName))
                File.Delete(ImageRecordName);
            using (FileStream fs = new FileStream(ImageRecordName, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf
                    = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                bf.Serialize(fs, locateDS);
                fs.Close();
            }
            sw1.Stop();
            calcBagOfVisualTime = Convert.ToInt32(sw1.Elapsed.TotalSeconds);
            logWriter(string.Format("Extracting: {0} sec, KMeanTime: {1} sec, CalcBagOfVisalTime: {2} sec", extractingTime, kMeanTime, calcBagOfVisualTime));
        }
Example #51
0
            public (List <string> classes, KMeans kmeans, OneVsAllSupportVectorMachine svm) FinishLearning(
                int vectorLength,
                CancellationToken cancellationToken)
            {
                // count classes
                List <string> classes = new List <string>(this.features.Select(x => x.truth).ToLookup(x => x).Select(x => x.Key));

                if (classes.Count < 2)
                {
                    throw new ArgumentException();
                }

                classes.Sort();

                // count vectors
                int numberOfVectors = this.features.Sum(x => x.features.Count);

                // copy vectors
                Dictionary <IVector <float>, float> vectors = new Dictionary <IVector <float>, float>(numberOfVectors);

                for (int i = 0, ii = this.features.Count; i < ii; i++)
                {
                    FeatureDetectors.Features f = this.features[i].features;
                    for (int j = 0, jj = f.Count, len = f.Length, off = 0; j < jj; j++, off += len)
                    {
                        ////DenseVectorF vector = new DenseVectorF(len, f.X, off);
                        SparseVectorF vector = SparseVectorF.FromDense(len, f.X, off);
                        vectors[vector] = vectors.TryGetValue(vector, out float weight) ? weight + 1.0f : 1.0f;
                    }
                }

                cancellationToken.ThrowIfCancellationRequested();

                // learn k-means
                KMeans kmeans = KMeans.Learn(
                    vectorLength,
                    KMeansSeeding.Random,
                    2,
                    default(EuclideanDistance),
                    vectors.Keys.ToList(),
                    vectors.Values.ToList(),
                    cancellationToken);

                cancellationToken.ThrowIfCancellationRequested();

                // learn svm
                Dictionary <string, int> classesLookup = classes.ToDictionary((x, i) => x, (x, i) => i);

                SequentualMinimalOptimization smo = new SequentualMinimalOptimization(new ChiSquare())
                {
                    Algorithm = SMOAlgorithm.LibSVM,
                    Tolerance = 0.01f,
                };

                List <float[]> svmx = new List <float[]>(this.features.Count);
                List <int>     svmy = new List <int>(this.features.Count);

                for (int i = 0, ii = this.features.Count; i < ii; i++)
                {
                    (FeatureDetectors.Features features, string truth) = this.features[i];
                    svmx.Add(PointsOfInterestClassifier.PrepareVector(kmeans, features, cancellationToken));
                    svmy.Add(classesLookup[truth]);
                }

                cancellationToken.ThrowIfCancellationRequested();

                OneVsAllSupportVectorMachine svm = OneVsAllSupportVectorMachine.Learn(
                    smo,
                    classes.Count,
                    svmx,
                    svmy,
                    null,
                    cancellationToken);

                cancellationToken.ThrowIfCancellationRequested();

                return(classes, kmeans, svm);
            }
        public IActionResult Partition2(int partitionCount)
        {
            using (var db = new FusekiContext())
            {
                var articles = db.Articles.Where(el => el.Published == true)
                               .Include(el => el.Tags).Take(20).ToList();
                //get a tag vector for each article.

                var allTags = new HashSet <string>();

                //TODO: What happens if we remove all tags which only occur once.
                foreach (var article in articles)
                {
                    foreach (var tag in article.Tags)
                    {
                        allTags.Add(tag.Name);
                    }
                }

                var newAllTags = new HashSet <string>();
                foreach (var t in allTags)
                {
                    var relatedArticles = db.Articles.Where(el => el.Tags.Select(tag => tag.Name).Contains(t));
                    if (relatedArticles.Count() > 1)
                    {
                        newAllTags.Add(t);
                    }
                }

                allTags = newAllTags;

                var allTagsOrdered = allTags.OrderBy(el => el);

                var obs  = new List <List <double> >();
                var dict = new Dictionary <string, object>();

                foreach (var article in articles)
                {
                    var articleTags = article.Tags.Select(el => el.Name);
                    var vector      = new List <double>();
                    foreach (var tag in allTagsOrdered)
                    {
                        if (articleTags.Contains(tag))
                        {
                            vector.Add(1);
                        }
                        else
                        {
                            vector.Add(0);
                        }
                    }
                    obs.Add(vector);
                }

                var vecvec = obs.Select(el => el.ToArray()).ToArray();

                var kmeans = new KMeans(k: partitionCount);

                var clusters = kmeans.Learn(vecvec);
                dict["Kmeans Error"]   = kmeans.Error;
                dict["dimensionality"] = kmeans.Dimension;
                dict["Iterations"]     = kmeans.Iterations;
                dict["MaxIterations"]  = kmeans.MaxIterations;
                dict["Tolerance"]      = kmeans.Tolerance;


                int[] labels = clusters.Decide(vecvec);
                //labels is array[articleId] => partitionNumber
                var ii    = 0;
                var psets = new List <PartitionSet <Article> >();

                //this is totally fake. TODO: refactor these to be dumber - no need to have comparators etc.
                var dm = new DistanceMetrics <Article>((a, b) => Comparators.GetTagCommonality(a, b), (a, b) => Comparators.ArticleKeyLookup(a, b));
                while (ii < partitionCount)
                {
                    //TODO: is accord zero indexed?
                    psets.Add(new PartitionSet <Article>(dm, ii));
                    ii++;
                }
                var index = 0;
                foreach (var l in labels)
                {
                    var article = articles[index];
                    index++;
                    psets[l].Add(article);
                }


                var partitiondata = new PartitionData <Article>(psets, dict);

                var model = new ArticlePartitionModel(partitiondata);
                return(View("ArticlePartitions", model));
            }
        }
Example #53
0
        public void learn_test_mixed()
        {
            #region doc_learn_mixed
            Accord.Math.Random.Generator.Seed = 0;

            // Declare some mixed discrete and continuous observations
            double[][] observations =
            {
                //             (categorical) (discrete) (continuous)
                new double[] { 1, -1, -2.2 },
                new double[] { 1, -6, -5.5 },
                new double[] { 2,  1,  1.1 },
                new double[] { 2,  2,  1.2 },
                new double[] { 2,  2,  2.6 },
                new double[] { 3,  2,  1.4 },
                new double[] { 3,  4,  5.2 },
                new double[] { 1,  6,  5.1 },
                new double[] { 1,  6,  5.9 },
            };

            // Create a new codification algorithm to convert
            // the mixed variables above into all continuous:
            var codification = new Codification <double>()
            {
                CodificationVariable.Categorical,
                CodificationVariable.Discrete,
                CodificationVariable.Continuous
            };

            // Learn the codification from observations
            var model = codification.Learn(observations);

            // Transform the mixed observations into only continuous:
            double[][] newObservations = model.ToDouble().Transform(observations);

            // (newObservations will be equivalent to)
            double[][] expected =
            {
                //               (one hot)    (discrete)    (continuous)
                new double[] { 1, 0, 0, -1, -2.2 },
                new double[] { 1, 0, 0, -6, -5.5 },
                new double[] { 0, 1, 0,  1,  1.1 },
                new double[] { 0, 1, 0,  2,  1.2 },
                new double[] { 0, 1, 0,  2,  2.6 },
                new double[] { 0, 0, 1,  2,  1.4 },
                new double[] { 0, 0, 1,  4,  5.2 },
                new double[] { 1, 0, 0,  6,  5.1 },
                new double[] { 1, 0, 0,  6,  5.9 },
            };

            // Create a new K-Means algorithm
            KMeans kmeans = new KMeans(k: 3);

            // Compute and retrieve the data centroids
            var clusters = kmeans.Learn(observations);

            // Use the centroids to parition all the data
            int[] labels = clusters.Decide(observations);
            #endregion


            Assert.IsTrue(expected.IsEqual(newObservations, 1e-8));

            Assert.AreEqual(3, codification.NumberOfInputs);
            Assert.AreEqual(5, codification.NumberOfOutputs);
            Assert.AreEqual(3, codification.Columns.Count);
            Assert.AreEqual("0", codification.Columns[0].ColumnName);
            Assert.AreEqual(3, codification.Columns[0].NumberOfSymbols);
            Assert.AreEqual(1, codification.Columns[0].NumberOfInputs);
            Assert.AreEqual(1, codification.Columns[0].NumberOfOutputs);
            Assert.AreEqual(3, codification.Columns[0].NumberOfClasses);
            Assert.AreEqual(CodificationVariable.Categorical, codification.Columns[0].VariableType);
            Assert.AreEqual("1", codification.Columns[1].ColumnName);
            Assert.AreEqual(1, codification.Columns[1].NumberOfSymbols);
            Assert.AreEqual(1, codification.Columns[1].NumberOfInputs);
            Assert.AreEqual(1, codification.Columns[1].NumberOfOutputs);
            Assert.AreEqual(1, codification.Columns[1].NumberOfClasses);
            Assert.AreEqual(CodificationVariable.Discrete, codification.Columns[1].VariableType);
            Assert.AreEqual("2", codification.Columns[2].ColumnName);
            Assert.AreEqual(1, codification.Columns[2].NumberOfSymbols);
            Assert.AreEqual(1, codification.Columns[2].NumberOfInputs);
            Assert.AreEqual(1, codification.Columns[2].NumberOfOutputs);
            Assert.AreEqual(1, codification.Columns[2].NumberOfClasses);
            Assert.AreEqual(CodificationVariable.Continuous, codification.Columns[2].VariableType);

            Assert.AreEqual(labels[0], labels[2]);
            Assert.AreEqual(labels[0], labels[3]);
            Assert.AreEqual(labels[0], labels[4]);
            Assert.AreEqual(labels[0], labels[5]);

            Assert.AreEqual(labels[6], labels[7]);
            Assert.AreEqual(labels[6], labels[8]);

            Assert.AreNotEqual(labels[0], labels[1]);
            Assert.AreNotEqual(labels[0], labels[6]);

            int[] labels2 = kmeans.Clusters.Decide(observations);
            Assert.IsTrue(labels.IsEqual(labels2));

            var c = new KMeansClusterCollection.KMeansCluster[clusters.Count];
            int i = 0;
            foreach (var cluster in clusters)
            {
                c[i++] = cluster;
            }

            for (i = 0; i < c.Length; i++)
            {
                Assert.AreSame(c[i], clusters[i]);
            }
        }
        public void buildModel()
        {
            if (inputMatrix == null) getMatrix();
            switch (cType)
            {
                case clusterType.KMEANS:
                    KMeans kmeans = new KMeans(k);
                    kmeans.Compute(inputMatrix, precision);
                    clusterCollection = kmeans.Clusters;
                    model = kmeans;
                    break;
                case clusterType.BINARY:
                    BinarySplit bSplit = new BinarySplit(k);
                    bSplit.Compute(inputMatrix, precision);
                    clusterCollection = bSplit.Clusters;
                    model = bSplit;
                    //Console.WriteLine("BinarySplit");
                    break;
                case clusterType.GAUSSIANMIXTURE:
                    GaussianMixtureModel gModel = new GaussianMixtureModel(k);
                    gModel.Compute(inputMatrix, precision);
                    clusterCollection = gModel.Gaussians;
                    model = gModel;
                    break;
                default:
                    break;
            }

            lbl = new List<string>();
            for (int i = 0; i < k; i++)
            {
                lbl.Add(i.ToString());
            }
        }
Example #55
0
        public void learn_test()
        {
            #region doc_learn
            Accord.Math.Random.Generator.Seed = 0;

            // Declare some observations
            double[][] observations =
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            // Create a new K-Means algorithm
            KMeans kmeans = new KMeans(k: 3);

            // Compute and retrieve the data centroids
            var clusters = kmeans.Learn(observations);

            // Use the centroids to parition all the data
            int[] labels = clusters.Decide(observations);
            #endregion

            Assert.AreEqual(labels[0], labels[1]);

            Assert.AreEqual(labels[2], labels[3]);
            Assert.AreEqual(labels[2], labels[4]);
            Assert.AreEqual(labels[2], labels[5]);

            Assert.AreEqual(labels[6], labels[7]);
            Assert.AreEqual(labels[6], labels[8]);

            Assert.AreNotEqual(labels[0], labels[2]);
            Assert.AreNotEqual(labels[2], labels[6]);
            Assert.AreNotEqual(labels[0], labels[6]);

            int[] labels2 = kmeans.Clusters.Decide(observations);
            Assert.IsTrue(labels.IsEqual(labels2));

            // the data must not have changed!
            double[][] orig =
            {
                new double[] { -5, -2, -1 },
                new double[] { -5, -5, -6 },
                new double[] {  2,  1,  1 },
                new double[] {  1,  1,  2 },
                new double[] {  1,  2,  2 },
                new double[] {  3,  1,  2 },
                new double[] { 11,  5,  4 },
                new double[] { 15,  5,  6 },
                new double[] { 10,  5,  6 },
            };

            Assert.IsTrue(orig.IsEqual(observations));

            var c = new KMeansClusterCollection.KMeansCluster[clusters.Count];
            int i = 0;
            foreach (var cluster in clusters)
            {
                c[i++] = cluster;
            }

            for (i = 0; i < c.Length; i++)
            {
                Assert.AreSame(c[i], clusters[i]);
            }
        }
        private void setKMeansCluster(System.IO.StreamReader sr)
        {
            KMeans kmeans = new KMeans(k);
            KMeansClusterCollection kmeansColl = kmeans.Clusters;
            for (int i = 0; i < k; i++)
            {
                double[] mns = (from s in (sr.ReadLine().Split(new char[] { ',' })) select System.Convert.ToDouble(s)).ToArray();
                string[] covVlsStr = sr.ReadLine().Split(new char[] { ',' });
                double p = System.Convert.ToDouble(sr.ReadLine());
                double[,] cov = new double[VariableFieldNames.Length, VariableFieldNames.Length];
                for (int j = 0; j < VariableFieldNames.Length; j++)
                {
                    for (int l = 0; l < VariableFieldNames.Length; l++)
                    {
                        int indexVl = (j * VariableFieldNames.Length) + l;
                        cov[l, j] = System.Convert.ToDouble(covVlsStr[indexVl]);
                    }
                }

                KMeansCluster kc = new KMeansCluster(kmeansColl, i);
                kc.Mean = mns;
                kc.Covariance = cov;
                kc.Proportion = p;
            }
            clusterCollection = kmeansColl;
            model = kmeans;
        }
Example #57
0
    static void Main(string[] args)
    {
        // 1. allocate a new dataflow computation.
        using (var computation = NewComputation.FromArgs(ref args))
        {
            if (args.Length != 6)
            {
                PrintHelp();
                return;
            }

            Int32 procid     = computation.Configuration.ProcessID;
            Int32 thread_num = computation.Configuration.WorkerCount;
            Int32 worker_num = computation.Configuration.Processes;

            Int32  dimension     = Int32.Parse(args[0]);
            Int32  cluster_num   = Int32.Parse(args[1]);
            Int32  iteration_num = Int32.Parse(args[2]);
            Int32  partition_num = Int32.Parse(args[3]);
            double sample_num_m  = Convert.ToDouble(args[4]);
            Int64  spin_wait     = Int64.Parse(args[5]);

            Console.Out.WriteLine("dimension: " + dimension);
            Console.Out.WriteLine("cluster_num: " + cluster_num);
            Console.Out.WriteLine("iteration_num: " + iteration_num);
            Console.Out.WriteLine("partition_num: " + partition_num);
            Console.Out.WriteLine("sample_num_m: " + sample_num_m);
            Console.Out.WriteLine("spin_wait: " + spin_wait);
            Console.Out.WriteLine("procid: " + procid);
            Console.Out.WriteLine("worker_num: " + worker_num);
            Console.Out.WriteLine("thread_num: " + thread_num);
            Console.Out.Flush();

            KMeans km =
                new KMeans(dimension,
                           cluster_num,
                           iteration_num,
                           partition_num,
                           sample_num_m,
                           spin_wait,
                           procid,
                           worker_num,
                           thread_num);

            Stream <SampleBatch, Epoch> samples = km.GenerateSamples().AsNaiadStream(computation);
            samples = samples.PartitionBy(s => (int)(s[0][0]));
            var end_samples = samples.Iterate((lc, s) => km.Advance(s), iteration_num, "KMeans");
            // var output = end_samples.Subscribe(x => {
            //                                           Console.Out.WriteLine("Final center 0: " + PrintList(km.means_[0]));
            //                                           Console.Out.Flush();
            //                                        });

            Console.Out.WriteLine("Before Activate!");
            Console.Out.Flush();
            // start the computation, fixing the structure of the dataflow graph.
            computation.Activate();
            Console.Out.WriteLine("After Activate!");
            Console.Out.Flush();

            // block until all work is finished.
            computation.Join();
            Console.Out.WriteLine("After Join!");


            double average_total   = km.total_times_.GetRange(truncate_index_, iteration_num - truncate_index_).Average();
            double average_compute = km.compute_times_.GetRange(truncate_index_, iteration_num - truncate_index_).Average();
            double average_idle    = average_total - average_compute;
            Console.Out.WriteLine("*** Average for the last {0:D2} iterations: compute(ms): {1:F2} total(ms): {2:F2} (idle(ms): {3:F2})",
                                  iteration_num - truncate_index_, 1000 * average_compute, 1000 * average_total, 1000 * average_idle);


            for (int i = 0; i < cluster_num; ++i)
            {
                Console.Out.WriteLine("Final center {0:D2}: {1:S}: ", i, PrintList(km.means_[i]));
            }
            Console.Out.WriteLine("Samples Counts: " + PrintList(km.sample_counter));
            Console.Out.WriteLine("Reduce Level 1 Counts: " + PrintList(km.reduce_l1_counter_));
            Console.Out.WriteLine("Reduce Level 2 Counts: " + PrintList(km.reduce_l2_counter_));
            Console.Out.WriteLine("Sync Level 1 Counts: " + PrintList(km.sync_l1_counter_));
            Console.Out.WriteLine("Sync Level 2 Counts: " + PrintList(km.sync_l2_counter_));
            Console.Out.WriteLine("Sync Tags: " + PrintHashSet(km.sync_tags_));
            Console.Out.WriteLine("Reduce Tags: " + PrintHashSet(km.reduce_tags_));
            Console.Out.WriteLine("Clustering Tags: " + PrintHashSet(km.clustering_tags_));
            Console.Out.Flush();
        }
    }
Example #58
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            ServiceContainers.Explode(ForceScale);
            return;
        }

        if (Input.GetKeyDown(KeyCode.C))
        {
            var itemsTmp  = ServiceContainers.Select(c => c.transform.position).ToArray();
            var resultTmp = KMeans.Cluster(itemsTmp, ClusterCount, Iterations, 0);
            foreach (var cluster in resultTmp.clusters)
            {
                var force = Random.onUnitSphere * ForceScale;
                cluster.Select(i => ServiceContainers[i]).AddForce(force);
            }
            return;
        }

        if (Input.GetKeyDown(KeyCode.A))
        {
            foreach (var spring in ServiceContainers.SelectMany(s => s.gameObject.GetComponents <SpringJoint>()))
            {
                spring.maxDistance = 3.0f;
                spring.damper      = 1.0f;
            }
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (running)
            {
                timeScaleBackup = Time.timeScale;
                Time.timeScale  = 0;
                running         = false;
            }
            else
            {
                Time.timeScale = timeScaleBackup;
                running        = true;
                clusterized    = false;
            }
        }

        if (running || clusterized)
        {
            return;
        }

        var items  = ServiceContainers.Select(c => c.transform.position).ToArray();
        var result = KMeans.Cluster(items, ClusterCount, Iterations, 0);

        for (var i = 0; i < result.clusters.Length; i++)
        {
            var color = Color.HSVToRGB(1f * i / result.clusters.Length, 1f, 1f);
            for (var j = 0; j < result.clusters[i].Length; j++)
            {
                var index = result.clusters[i][j];
                ServiceContainers[index].GetComponent <MeshRenderer>().material.color = color;
            }
        }

        clusterized = true;
    }
Example #59
0
        static void Main()
        {
            Accord.Math.Random.Generator.Seed = 1232;

            // Declare some observations
            double[][] observations =
            {
                new double[] { 291.5,  81.5 },
                new double[] {   316,  87.5 },
                new double[] {   337,  92.5 },
                new double[] {   367,    87 },
                new double[] { 363.5,   102 },
                new double[] {   378,   105 },
                new double[] {   411, 108.5 },
                new double[] { 428.5, 116.5 },
                new double[] { 465.5,   120 },
                new double[] {   477, 111.5 },
                new double[] { 448.5, 124.5 },
                new double[] {   276, 126.5 },
                new double[] { 503.5,   129 },
                new double[] {   474, 126.5 },
                new double[] { 485.5,   129 },
                new double[] { 293.5, 134.5 },
                new double[] {   313, 138.5 },
                new double[] { 333.5, 146.5 },
                new double[] {   355, 147.5 },
                new double[] { 373.5, 152.5 },
                new double[] {   393,   160 },
                new double[] { 413.5,   161 },
                new double[] {  98.5, 327.5 },
                new double[] {   113, 338.5 },
                new double[] { 130.5, 344.5 },
                new double[] { 146.5, 347.5 },
                new double[] {   171,   355 },
                new double[] {   189, 364.5 },
                new double[] { 223.5,   372 },
                new double[] {   208, 374.5 },
                new double[] {   237, 365.5 },
                new double[] {    74,   379 },
                new double[] {   232, 379.5 },
                new double[] {   262, 385.5 },
                new double[] {   244,   384 },
                new double[] {    92, 388.5 },
                new double[] {   112,   395 },
                new double[] {   131,   405 },
                new double[] {   152, 408.5 },
                new double[] { 170.5, 415.5 },
                new double[] {   485, 421.5 },
                new double[] {   546, 421.5 },
                new double[] {   742, 421.5 },
                new double[] {   189,   425 },
                new double[] { 506.5, 424.5 },
                new double[] { 528.5, 424.5 },
                new double[] {   583, 424.5 },
                new double[] {   604, 424.5 },
                new double[] { 624.5, 424.5 },
                new double[] {   653,   430 },
                new double[] {   695, 424.5 },
                new double[] { 764.5, 424.5 },
                new double[] {   721,   425 },
                new double[] {   208, 428.5 },
                new double[] {   242, 436.5 },
                new double[] {   267,   445 },
                new double[] { 286.5,   452 },
            };

            //observations.Add(new double[][] { (double)2.8, 3.3 });

            // Create a new K-Means algorithm
            KMeans kmeans = new KMeans(k: 3);

            // Compute and retrieve the data centroids
            var clusters = kmeans.Learn(observations);

            // Use the centroids to parition all the data
            int[] labels = clusters.Decide(observations);

            Console.WriteLine("Hello World!");

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
Example #60
0
        private void btnInitialize_Click(object sender, EventArgs e)
        {
            kmeans = new KMeans(k);

            kmeans.Compute(mixture);

            // Classify all instances in mixture data
            int[] classifications = kmeans.Classify(mixture);

            // Draw the classifications
            updateGraph(classifications);
        }