예제 #1
0
        public void ConstructorTest()
        {
            double[][] inputs =
            {
                new double[] {  10, 42 },
                new double[] { 162, 96 },
                new double[] { 125, 20 },
                new double[] {  96,  6 },
                new double[] {   2, 73 },
                new double[] {  52, 51 },
                new double[] {  71, 49 },
            };

            int[] outputs =
            {
                -1, -1, +1, +1, -1, -1, +1
            };


            var classifier = new Boost <DecisionStump>();

            var teacher = new AdaBoost <DecisionStump>(classifier)
            {
                Creation = (weights) =>
                {
                    var stump = new DecisionStump(2);
                    stump.Learn(inputs, outputs, weights);
                    return(stump);
                },

                Iterations = 5,
                Tolerance  = 1e-3
            };


            double error = teacher.Run(inputs, outputs);

            Assert.AreEqual(0, error);

            Assert.AreEqual(5, classifier.Models.Count);
            Assert.AreEqual(0.16684734250395147, classifier.Models[0].Weight);
            Assert.AreEqual(0.22329026900109736, classifier.Models[1].Weight);
            Assert.AreEqual(0.28350372170582383, classifier.Models[2].Weight);
            Assert.AreEqual(0.16684734250395139, classifier.Models[3].Weight);
            Assert.AreEqual(0.15951132428517592, classifier.Models[4].Weight);

            int[] actual = new int[outputs.Length];
            for (int i = 0; i < actual.Length; i++)
            {
                actual[i] = classifier.Compute(inputs[i]);
            }

            for (int i = 0; i < actual.Length; i++)
            {
                Assert.AreEqual(outputs[i], actual[i]);
            }
        }
예제 #2
0
        public void learn_stump_classifier()
        {
            #region doc_learn
            // Let's say we want to classify the following 2-dimensional
            // data samples into 2 possible classes, either true or false:
            double[][] inputs =
            {
                new double[] {  10, 42 },
                new double[] { 162, 96 },
                new double[] { 125, 20 },
                new double[] {  96,  6 },
                new double[] {   2, 73 },
                new double[] {  52, 51 },
                new double[] {  71, 49 },
            };

            // And those are their associated class labels
            bool[] outputs =
            {
                false, false, true, true, false, false, true
            };

            // We create a learning algorithm as:
            var teacher = new ThresholdLearning();

            // Now, we can use the Learn method to learn a classifier:
            DecisionStump classifier = teacher.Learn(inputs, outputs);

            // Now, we can check how good it is using a confusion matrix:
            var cm = ConfusionMatrix.Estimate(classifier, inputs, outputs);

            double error = cm.Error; // should be ~0.14

            // We can also compute the model outputs for new samples using
            bool y = classifier.Decide(new double[] { 71, 48 }); // should be false
            #endregion

            Assert.AreEqual(false, y);
            Assert.AreEqual(0.14285714285714285, error, 1e-10);
        }
예제 #3
0
        public void ConstructorTest()
        {
            // Let's say we want to classify the following 2-dimensional
            // data samples into 2 possible classes, either true or false:
            double[][] inputs =
            {
                new double[] {  10, 42 },
                new double[] { 162, 96 },
                new double[] { 125, 20 },
                new double[] {  96,  6 },
                new double[] {   2, 73 },
                new double[] {  52, 51 },
                new double[] {  71, 49 },
            };

            // And those are their associated class labels
            int[] outputs =
            {
                -1, -1, +1, +1, -1, -1, +1
            };


            // First, we create a classsifier using:
            var classifier = new Boost <DecisionStump>();

            // Now, we can create a AdaBoost learning algorithm as:
            var teacher = new AdaBoost <DecisionStump>(classifier)
            {
                Creation = (weights) =>
                {
                    var stump = new DecisionStump(2);
                    stump.Learn(inputs, outputs, weights);
                    return(stump);
                },

                // Train until:
                MaxIterations = 5,
                Tolerance     = 1e-3
            };

            // Now, we can use the Run method to learn:
            double error = teacher.Run(inputs, outputs); // error should be zero.

            // Now, we can compute the model outputs for new samples using
            int y = classifier.Compute(new double[] { 71, 48 }); // should be 1

            Assert.AreEqual(1, y);

            Assert.AreEqual(0, error);

            Assert.AreEqual(5, classifier.Models.Count);
            Assert.AreEqual(0.16684734250395147, classifier.Models[0].Weight);
            Assert.AreEqual(0.22329026900109736, classifier.Models[1].Weight);
            Assert.AreEqual(0.28350372170582383, classifier.Models[2].Weight);
            Assert.AreEqual(0.16684734250395139, classifier.Models[3].Weight);
            Assert.AreEqual(0.15951132428517592, classifier.Models[4].Weight);

            int[] actual = new int[outputs.Length];
            for (int i = 0; i < actual.Length; i++)
            {
                actual[i] = classifier.Compute(inputs[i]);
            }

            for (int i = 0; i < actual.Length; i++)
            {
                Assert.AreEqual(outputs[i], actual[i]);
            }
        }