Ejemplo n.º 1
0
        public void MeansClustering2()
        {
            ColumnVector[] centers = new ColumnVector[] {
                new ColumnVector(0.0, 0.0, 0.0),
                new ColumnVector(2.0, 0.0, 0.0),
                new ColumnVector(0.0, 2.0, 0.0),
                new ColumnVector(0.0, 0.0, 2.0)
            };

            FrameTable table    = new FrameTable();
            string     alphabet = "abcdefghijklmnopqrstuvwxyz";

            for (int j = 0; j < 3; j++)
            {
                table.AddColumn <double>(alphabet[j].ToString());
            }


            List <int>          inputAssignments = new List <int>();
            List <ColumnVector> inputVectors     = new List <ColumnVector>();
            Random rng = new Random(2);
            ContinuousDistribution dist = new NormalDistribution(0.0, 1.0);

            for (int i = 0; i < 100; i++)
            {
                int inputAssignment = rng.Next(0, centers.Length);
                inputAssignments.Add(inputAssignment);
                ColumnVector inputVector = centers[inputAssignment].Copy();
                for (int k = 0; k < inputVector.Dimension; k++)
                {
                    inputVector[k] += dist.GetRandomValue(rng);
                }
                inputVectors.Add(inputVector);
                table.AddRow <double>(inputVector);
            }

            MeansClusteringResult result = table.AsColumns <double>().MeansClustering(centers.Length);

            //MultivariateSample s = new MultivariateSample(3);
            //foreach (ColumnVector v in inputVectors) { s.Add(v); }
            //MeansClusteringResult result = s.MeansClustering(centers.Length);

            List <int> outputAssignments = new List <int>();

            for (int i = 0; i < inputVectors.Count; i++)
            {
                int assignment = result.Classify(inputVectors[i]);
                outputAssignments.Add(assignment);
            }

            // Map the output centroids to the original centroids
            Dictionary <int, int> map = new Dictionary <int, int>();

            for (int outputIndex = 0; outputIndex < result.Count; outputIndex++)
            {
                ColumnVector centroid            = result.Centroid(outputIndex);
                int          mappedInputIndex    = -1;
                double       mappedInputDistance = Double.MaxValue;
                for (int inputIndex = 0; inputIndex < centers.Length; inputIndex++)
                {
                    double distance = (centroid - centers[inputIndex]).Norm();
                    if (distance < mappedInputDistance)
                    {
                        mappedInputIndex    = inputIndex;
                        mappedInputDistance = distance;
                    }
                }
                Assert.IsTrue(mappedInputIndex >= 0);
                Assert.IsTrue(mappedInputDistance < 1.0);
                map.Add(outputIndex, mappedInputIndex);
            }

            int correctCount = 0;

            for (int i = 0; i < outputAssignments.Count; i++)
            {
                if (map[outputAssignments[i]] == inputAssignments[i])
                {
                    correctCount++;
                }
            }
            Assert.IsTrue(correctCount >= 0.50 * outputAssignments.Count);
        }