public void FixedWeightsTest()
        {
            var dataset = KernelSupportVectorMachineTest.training;
            var inputs  = dataset.Submatrix(null, 0, 3);
            var labels  = Tools.Scale(0, 1, -1, 1, dataset.GetColumn(4)).ToInt32();

            var machine = new KernelSupportVectorMachine(
                Gaussian.Estimate(inputs), inputs[0].Length);

            var smo = new SequentialMinimalOptimization(machine, inputs, labels);

            smo.Complexity = 10;

            double error = smo.Run();

            Assert.AreEqual(0.19047619047619047, error);
            Assert.AreEqual(265.78327637381551, ((Gaussian)machine.Kernel).Sigma);
            Assert.AreEqual(29, machine.SupportVectors.Length);

            double[] expectedWeights =
            {
                1.65717694716503,    1.20005456611466, -5.70824245415995,                10,
                10,                 -2.38755497916487,                10, -8.15723436363058,              10, -10, 10,
                10,                -0.188634936781317,  -5.4354281009458, -8.48341139483265,
                -5.91105702760141,  -5.71489190049223,                10, -2.37289205235858,
                -3.33031262413522,  -1.97545116517677,                10,               -10, -9.563186799279,
                -3.917941544845,   -0.532584110773336,  4.81951847548326, 0.343668292727091,
                -4.34159482731336
            };

            //Assert.IsTrue(expectedWeights.IsEqual(machine.Weights, 1e-5));

            int[] actual = new int[labels.Length];
            for (int i = 0; i < actual.Length; i++)
            {
                actual[i] = Math.Sign(machine.Compute(inputs[i]));
            }

            ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

            Assert.AreEqual(8, matrix.FalseNegatives);
            Assert.AreEqual(0, matrix.FalsePositives);
            Assert.AreEqual(4, matrix.TruePositives);
            Assert.AreEqual(30, matrix.TrueNegatives);

            Assert.AreEqual(1 / 3.0, matrix.Sensitivity);
            Assert.AreEqual(1, matrix.Specificity);

            Assert.AreEqual(0.5, matrix.FScore);
            Assert.AreEqual(0.5129891760425771, matrix.MatthewsCorrelationCoefficient);
        }
Exemplo n.º 2
0
        public void ComputeTest5()
        {
            double[][] inputs = training.Submatrix(null, 0, 3);

            int[] labels = Tools.Scale(0, 1, -1, 1, training.GetColumn(4)).ToInt32();

            Gaussian kernel = Gaussian.Estimate(inputs);

            var machine = new KernelSupportVectorMachine(kernel, inputs[0].Length);

            var smo = new SequentialMinimalOptimization(machine, inputs, labels);


            smo.Complexity          = 1.0;
            smo.UseClassProportions = true;

            double error = smo.Run();

            Assert.AreEqual(1, smo.Complexity);
            Assert.AreEqual(0.4, smo.PositiveWeight);
            Assert.AreEqual(1.0, smo.NegativeWeight);
            Assert.AreEqual(0.4, smo.WeightRatio, 1e-10);
            Assert.AreEqual(0.38095238095238093, error);
            Assert.AreEqual(265.78327637381551, (machine.Kernel as Gaussian).Sigma);
            Assert.AreEqual(32, machine.SupportVectors.Length);


            int[] actual = new int[labels.Length];
            for (int i = 0; i < actual.Length; i++)
            {
                actual[i] = Math.Sign(machine.Compute(inputs[i]));
            }

            ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

            Assert.AreEqual(7, matrix.FalseNegatives);
            Assert.AreEqual(9, matrix.FalsePositives);
            Assert.AreEqual(5, matrix.TruePositives);
            Assert.AreEqual(21, matrix.TrueNegatives);

            Assert.AreEqual(0.41666666666666669, matrix.Sensitivity);
            Assert.AreEqual(0.7, matrix.Specificity);
        }
        public void UseClassProportionsTest()
        {
            var dataset = KernelSupportVectorMachineTest.training;
            var inputs  = dataset.Submatrix(null, 0, 3);
            var labels  = Tools.Scale(0, 1, -1, 1, dataset.GetColumn(4)).ToInt32();

            Gaussian kernel  = Gaussian.Estimate(inputs);
            var      machine = new KernelSupportVectorMachine(kernel, inputs[0].Length);
            var      smo     = new SequentialMinimalOptimization(machine, inputs, labels);

            smo.Complexity          = 1.0;
            smo.UseClassProportions = true;

            double error = smo.Run();

            Assert.AreEqual(1, smo.Complexity);
            Assert.AreEqual(0.4, smo.PositiveWeight);
            Assert.AreEqual(1.0, smo.NegativeWeight);
            Assert.AreEqual(0.4, smo.WeightRatio, 1e-10);
            Assert.AreEqual(0.2857142857142857, error);
            Assert.AreEqual(265.78327637381551, ((Gaussian)machine.Kernel).Sigma);
            Assert.AreEqual(26, machine.SupportVectors.Length);


            int[] actual = new int[labels.Length];
            for (int i = 0; i < actual.Length; i++)
            {
                actual[i] = Math.Sign(machine.Compute(inputs[i]));
            }

            ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

            Assert.AreEqual(12, matrix.FalseNegatives);
            Assert.AreEqual(0, matrix.FalsePositives);
            Assert.AreEqual(0, matrix.TruePositives);
            Assert.AreEqual(30, matrix.TrueNegatives);
        }
        public void WeightRatioTest()
        {
            var dataset = KernelSupportVectorMachineTest.training;
            var inputs  = dataset.Submatrix(null, 0, 3);
            var labels  = Tools.Scale(0, 1, -1, 1, dataset.GetColumn(4)).ToInt32();

            Gaussian kernel = Gaussian.Estimate(inputs);

            {
                var machine = new KernelSupportVectorMachine(kernel, inputs[0].Length);
                var smo     = new SequentialMinimalOptimization(machine, inputs, labels);

                smo.Complexity  = 1.0;
                smo.WeightRatio = 10;

                double error = smo.Run();

                Assert.AreEqual(1.0, smo.PositiveWeight);
                Assert.AreEqual(0.1, smo.NegativeWeight);
                Assert.AreEqual(0.7142857142857143, error);
                Assert.AreEqual(265.78327637381551, ((Gaussian)machine.Kernel).Sigma);
                Assert.AreEqual(39, machine.SupportVectors.Length);


                int[] actual = new int[labels.Length];
                for (int i = 0; i < actual.Length; i++)
                {
                    actual[i] = Math.Sign(machine.Compute(inputs[i]));
                }

                ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

                Assert.AreEqual(12, matrix.TruePositives); // has more importance
                Assert.AreEqual(0, matrix.FalseNegatives); // has more importance
                Assert.AreEqual(30, matrix.FalsePositives);
                Assert.AreEqual(0, matrix.TrueNegatives);

                Assert.AreEqual(1.0, matrix.Sensitivity);
                Assert.AreEqual(0.0, matrix.Specificity);

                Assert.AreEqual(0.44444444444444448, matrix.FScore);
                Assert.AreEqual(0.0, matrix.MatthewsCorrelationCoefficient);
            }

            {
                var machine = new KernelSupportVectorMachine(kernel, inputs[0].Length);
                var smo     = new SequentialMinimalOptimization(machine, inputs, labels);

                smo.Complexity  = 1.0;
                smo.WeightRatio = 0.1;

                double error = smo.Run();

                Assert.AreEqual(0.1, smo.PositiveWeight);
                Assert.AreEqual(1.0, smo.NegativeWeight);
                Assert.AreEqual(0.21428571428571427, error);
                Assert.AreEqual(265.78327637381551, ((Gaussian)machine.Kernel).Sigma);
                Assert.AreEqual(18, machine.SupportVectors.Length);


                int[] actual = new int[labels.Length];
                for (int i = 0; i < actual.Length; i++)
                {
                    actual[i] = Math.Sign(machine.Compute(inputs[i]));
                }

                ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

                Assert.AreEqual(8, matrix.FalseNegatives);
                Assert.AreEqual(1, matrix.FalsePositives); // has more importance
                Assert.AreEqual(4, matrix.TruePositives);
                Assert.AreEqual(29, matrix.TrueNegatives); // has more importance

                Assert.AreEqual(0.33333333333333331, matrix.Sensitivity);
                Assert.AreEqual(0.96666666666666667, matrix.Specificity);

                Assert.AreEqual(0.47058823529411764, matrix.FScore);
                Assert.AreEqual(0.41849149947774944, matrix.MatthewsCorrelationCoefficient);
            }
        }
Exemplo n.º 5
0
        public void ComputeTest6()
        {
            double[][] inputs = training.Submatrix(null, 0, 3);

            int[] labels = Tools.Scale(0, 1, -1, 1, training.GetColumn(4)).ToInt32();

            Gaussian kernel = Gaussian.Estimate(inputs);

            {
                var machine = new KernelSupportVectorMachine(kernel, inputs[0].Length);
                var smo     = new SequentialMinimalOptimization(machine, inputs, labels);

                smo.Complexity  = 1.0;
                smo.WeightRatio = 30 / 12.0;

                double error = smo.Run();

                Assert.AreEqual(1, smo.PositiveWeight);
                Assert.AreEqual(0.4, smo.NegativeWeight);
                Assert.AreEqual(0.21428571428571427, error);
                Assert.AreEqual(265.78327637381551, (machine.Kernel as Gaussian).Sigma);
                Assert.AreEqual(34, machine.SupportVectors.Length);


                int[] actual = new int[labels.Length];
                for (int i = 0; i < actual.Length; i++)
                {
                    actual[i] = Math.Sign(machine.Compute(inputs[i]));
                }

                ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

                Assert.AreEqual(9, matrix.FalseNegatives);
                Assert.AreEqual(0, matrix.FalsePositives);
                Assert.AreEqual(3, matrix.TruePositives);
                Assert.AreEqual(30, matrix.TrueNegatives);

                Assert.AreEqual(0.25, matrix.Sensitivity);
                Assert.AreEqual(1.0, matrix.Specificity);

                Assert.AreEqual(0.4, matrix.FScore);
                Assert.AreEqual(0.4385290096535146, matrix.MatthewsCorrelationCoefficient);
            }

            {
                var machine = new KernelSupportVectorMachine(kernel, inputs[0].Length);
                var smo     = new SequentialMinimalOptimization(machine, inputs, labels);

                smo.Complexity  = 1.0;
                smo.WeightRatio = 12 / 30.0;

                double error = smo.Run();

                Assert.AreEqual(0.4, smo.PositiveWeight);
                Assert.AreEqual(1.0, smo.NegativeWeight);
                Assert.AreEqual(0.38095238095238093, error);
                Assert.AreEqual(265.78327637381551, (machine.Kernel as Gaussian).Sigma);
                Assert.AreEqual(32, machine.SupportVectors.Length);


                int[] actual = new int[labels.Length];
                for (int i = 0; i < actual.Length; i++)
                {
                    actual[i] = Math.Sign(machine.Compute(inputs[i]));
                }

                ConfusionMatrix matrix = new ConfusionMatrix(actual, labels);

                Assert.AreEqual(7, matrix.FalseNegatives);
                Assert.AreEqual(9, matrix.FalsePositives);
                Assert.AreEqual(5, matrix.TruePositives);
                Assert.AreEqual(21, matrix.TrueNegatives);

                Assert.AreEqual(0.41666666666666669, matrix.Sensitivity);
                Assert.AreEqual(0.7, matrix.Specificity);

                Assert.AreEqual(0.38461538461538458, matrix.FScore);
                Assert.AreEqual(0.11180339887498948, matrix.MatthewsCorrelationCoefficient);
            }
        }