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); }
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); } }
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); } }