예제 #1
0
파일: MainForm.cs 프로젝트: s76/Accord.NET
        /// <summary>
        ///   Estimates a suitable value for the Gaussian's kernel sigma
        /// </summary>
        ///
        private void btnEstimateSigma_Click(object sender, EventArgs e)
        {
            // Extract inputs
            int rows = dgvTrainingSource.Rows.Count;

            double[][] input = new double[rows][];
            for (int i = 0; i < rows; i++)
            {
                input[i] = (double[])dgvTrainingSource.Rows[i].Cells["colTrainingFeatures"].Value;
            }

            Gaussian g = Gaussian.Estimate(input, input.Length / 4);

            numSigma.Value = (decimal)g.Sigma;
        }
예제 #2
0
파일: MainForm.cs 프로젝트: tranntn/DoAn3
        private void btnEstimateGaussian_Click(object sender, EventArgs e)
        {
            DataTable source = dgvLearningSource.DataSource as DataTable;

            // Creates a matrix from the source data table
            double[,] sourceMatrix = source.ToMatrix(out columnNames);

            // Get only the input vector values (in the first two columns)
            double[][] inputs = sourceMatrix.GetColumns(0, 1, 2, 3, 4, 5).ToJagged();

            DoubleRange range; // valid range will be returned as an out parameter
            Gaussian    gaussian = Gaussian.Estimate(inputs, inputs.Length, out range);

            numSigma.Value = (decimal)gaussian.Sigma;
        }
예제 #3
0
파일: AI.cs 프로젝트: MiFuciy/Projects
        private IKernel createKernel(double[,] arr)
        {
            decimal numSigma = 0;

            //Data.DataTable source = arr as Data.DataTable;

            // Get only the input vector values (in the first two columns)
            double[][] inputs = arr.GetColumns(0, 1).ToJagged();

            DoubleRange range; // valid range will be returned as an out parameter
            Gaussian    gaussian = Gaussian.Estimate(inputs, inputs.Length, out range);

            numSigma = (decimal)gaussian.Sigma;

            return(new Accord.Statistics.Kernels.Gaussian((double)numSigma));
        }
예제 #4
0
        private void buttonEstimate_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show(this, "This action will first save the configuration. Do you wish to Continue?", "Save required", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (save())
                {
                    double[,] sourceMatrix = _model.FeatureTable.ToMatrix <double>(_activeFeatures.ToArray());
                    double[][]  inputs = sourceMatrix.ToArray();
                    DoubleRange range;

                    if (groupGaussianKernel.Enabled)
                    {
                        Gaussian gaussian = Gaussian.Estimate(inputs, inputs.Length, out range);
                        tbGaussianSigma.Value = (decimal)gaussian.Sigma;
                    }

                    if (groupPolyKernel.Enabled)
                    {
                    }

                    if (groupSigmoidKernel.Enabled)
                    {
                        Sigmoid sigmoid = Sigmoid.Estimate(inputs, inputs.Length, out range);

                        if (sigmoid.Alpha < (double)Decimal.MaxValue && sigmoid.Alpha > (double)Decimal.MinValue)
                        {
                            tbSigmoidAlpha.Value = (decimal)sigmoid.Alpha;
                        }

                        if (sigmoid.Constant < (double)Decimal.MaxValue && sigmoid.Constant > (double)Decimal.MinValue)
                        {
                            tbSigmoidConst.Value = (decimal)sigmoid.Constant;
                        }
                    }

                    if (groupLaplacianKernel.Enabled)
                    {
                        Laplacian laplacian = Laplacian.Estimate(inputs, inputs.Length, out range);
                        tbLaplacianSigma.Value = (decimal)laplacian.Sigma;
                    }
                }
                else
                {
                    MessageBox.Show("Failed to fully save the configuration.\nTherefore configuration properties can not be estimated.");
                }
            }
        }
예제 #5
0
        private void setKernalType(KernelType k)
        {
            switch (k)
            {
            case KernelType.Linear:
                kernel = new Linear();
                break;

            case KernelType.Quadratic:
                kernel = new Quadratic();
                break;

            case KernelType.Sigmoid:
                kernel = Sigmoid.Estimate(independentVls);
                break;

            case KernelType.Spline:
                kernel = new Spline();
                break;

            case KernelType.ChiSquared:
                kernel = new ChiSquare();
                break;

            case KernelType.Gaussian:
                kernel = Gaussian.Estimate(independentVls);
                break;

            case KernelType.Multiquadric:
                kernel = new Multiquadric();
                break;

            case KernelType.InverseMultquadric:
                kernel = new InverseMultiquadric();
                break;

            case KernelType.Laplacian:
                kernel = Laplacian.Estimate(independentVls);
                break;

            default:
                kernel = new Polynomial(2);
                break;
            }
        }
예제 #6
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);
        }
예제 #7
0
        public void GaussianEstimateTest()
        {
            // Suppose we have the following data 
            // 
            double[][] data =  
            { 
                new double[] { 5.1, 3.5, 1.4, 0.2 }, 
                new double[] { 5.0, 3.6, 1.4, 0.2 }, 
                new double[] { 4.9, 3.0, 1.4, 0.2 }, 
                new double[] { 5.8, 4.0, 1.2, 0.2 }, 
                new double[] { 4.7, 3.2, 1.3, 0.2 }, 
            };

            // Estimate an appropriate sigma from data 
            var kernel = Gaussian.Estimate(new Linear(0), data);
            double sigma = kernel.Sigma; // 0.36055512 
            double sigma2 = kernel.SigmaSquared;
            Assert.AreEqual(0.36055512754639879, sigma);
            Assert.AreEqual(sigma * sigma, sigma2);
        }
예제 #8
0
        public void GaussianEstimateTest()
        {
            // Suppose we have the following data 
            // 
            double[][] data =  
            { 
                new double[] { 5.1, 3.5, 1.4, 0.2 }, 
                new double[] { 5.0, 3.6, 1.4, 0.2 }, 
                new double[] { 4.9, 3.0, 1.4, 0.2 }, 
                new double[] { 5.8, 4.0, 1.2, 0.2 }, 
                new double[] { 4.7, 3.2, 1.3, 0.2 }, 
            };

            // Estimate an appropriate sigma from data 
            var dtw = new DynamicTimeWarping(1);
            var kernel = Gaussian.Estimate(dtw, data);
            double sigma = kernel.Sigma; 
            double sigma2 = kernel.SigmaSquared;
            Assert.AreEqual(0.044282096049367413, sigma);
            Assert.AreEqual(sigma * sigma, sigma2);
        }
예제 #9
0
        public void UseClassProportionsTest()
        {
            var dataset = KernelSupportVectorMachineTest.training;
            var inputs  = dataset.Submatrix(null, 0, 3);
            var labels  = Accord.Math.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);
        }
예제 #10
0
        public void WeightRatioTest()
        {
            var dataset = KernelSupportVectorMachineTest.training;
            var inputs  = dataset.Submatrix(null, 0, 3);
            var labels  = Accord.Math.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);
            }
        }
예제 #11
0
        public bool Train()
        {
            if (type == ClassifierType.SVM)
            {
                if (trainData != null)
                {
                    float[,] mat = trainData.Data;
                    double[][] inputs = new double[trainData.Rows][];
                    for (int i = 0; i < trainData.Rows; i++)
                    {
                        int numFeatures = Math.Max(trainData.Cols, 2);
                        inputs[i] = new double[numFeatures];
                        for (int j = 0; j < numFeatures; j++)
                        {
                            inputs[i][j] = mat[i, Math.Min(trainData.Cols - 1, j)];
                        }
                    }
                    int[] outputs = new int[trainLabels.Rows];
                    for (int i = 0; i < trainLabels.Rows; i++)
                    {
                        outputs[i] = trainLabels[i, 0];
                    }

                    int numClasses = nameForID.Count;

                    if (numClasses <= 1)
                    {
                        return(true);
                    }

                    IKernel kernel;
                    switch (kernelType)
                    {
                    case KernelType.Linear:
                        kernel = new Linear();
                        break;

                    case KernelType.Poly:
                        kernel = new Polynomial(3);
                        break;

                    case KernelType.Rbf:
                        if (inputs.Length < 20)
                        {
                            kernel = new Gaussian(0.1);
                        }
                        else
                        {
                            kernel = Gaussian.Estimate(inputs, inputs.Length / 4);
                        }
                        break;

                    case KernelType.Chi2:
                        kernel = new ChiSquare();
                        break;

                    default:
                        kernel = inputs[0].Length > 20 ? (IKernel)(new ChiSquare()) : (IKernel)(Gaussian.Estimate(inputs, inputs.Length / 4));
                        break;
                    }
                    svm = new MulticlassSupportVectorMachine(inputs: inputs[0].Length, kernel: kernel, classes: numClasses);
                    var teacher = new MulticlassSupportVectorLearning(svm, inputs, outputs)
                    {
                        Algorithm = (machine, classInputs, classOutputs, i, j) => new SequentialMinimalOptimization(machine, classInputs, classOutputs)
                        {
                            Tolerance = 1e-6,
                            UseComplexityHeuristic = true
                                                     //Tolerance = 0.001,
                                                     //Complexity = 1,
                                                     //CacheSize = 200
                        }
                    };
                    try
                    {
                        double error = teacher.Run();
                    }
                    catch (Exception ex) { Debug.WriteLine("Error training SVM: " + ex.Message); }

                    teacher = new MulticlassSupportVectorLearning(svm, inputs, outputs)
                    {
                        Algorithm = (machine, classInputs, classOutputs, i, j) => new ProbabilisticOutputCalibration(machine, classInputs, classOutputs)
                    };
                    try
                    {
                        double error = teacher.Run();
                    }
                    catch (Exception ex) { Debug.WriteLine("Error calibrating SVM: " + ex.Message); }

                    return(true);
                }
                return(false);
            }
            else if (type == ClassifierType.NeuralNet)
            {
                float[,] mat = trainData.Data;
                double[][] inputs      = new double[trainData.Rows][];
                List <int> randomOrder = new List <int>(trainData.Rows);
                for (int i = 0; i < trainData.Rows; i++)
                {
                    randomOrder.Add(i);
                }
                randomOrder.Shuffle();
                for (int i = 0; i < trainData.Rows; i++)
                {
                    inputs[randomOrder[i]] = new double[trainData.Cols];
                    for (int j = 0; j < trainData.Cols; j++)
                    {
                        inputs[randomOrder[i]][j] = mat[i, j];
                    }
                }
                int[] classes = new int[trainLabels.Rows];
                for (int i = 0; i < trainLabels.Rows; i++)
                {
                    classes[randomOrder[i]] = trainLabels[i, 0];
                }

                // First we have to convert this problem into a way that  the neural
                // network can handle. The first step is to expand the classes into
                // indicator vectors, where a 1 into a position signifies that this
                // position indicates the class the sample belongs to.
                //
                double[][] outputs = Accord.Statistics.Tools.Expand(classes, -1, +1);

                // Create an activation function for the net
                var function = new BipolarSigmoidFunction();

                // Create an activation network with the function and
                //  N inputs, (M+N)/2 hidden neurons and M possible outputs:
                int N = inputs[0].Length;
                int M = nameForID.Count;
                network = new ActivationNetwork(function, N, (M + N) / 2, M);

                // Randomly initialize the network
                new NguyenWidrow(network).Randomize();

                // Teach the network using parallel Rprop:
                var teacher = new ParallelResilientBackpropagationLearning(network);

                double error = 1.0;
                int    iter  = 0;
                while (error > 1e-7 && iter < 100)
                {
                    //for (int iter = 0; iter < 10000 && error > 1e-5; iter++)
                    error = teacher.RunEpoch(inputs, outputs);
                    iter++;
                }

                return(true);
            }
            else if (type == ClassifierType.KMeans)
            {
                List <double[]> rows = new List <double[]>();
                float[,] data = trainData.Data;
                for (int i = 0; i < trainData.Rows; i++)
                {
                    double[] row = new double[trainData.Cols];
                    for (int j = 0; j < trainData.Cols; j++)
                    {
                        row[j] = data[i, j];
                    }
                    rows.Add(row);
                }
                double[][] points = rows.ToArray();

                kmeans = new Accord.MachineLearning.KMeans(nameForID.Count * 2);
                int[] labels = kmeans.Compute(points);
                clusterClasses = new Dictionary <int, Dictionary <int, int> >();
                for (int i = 0; i < labels.Length; i++)
                {
                    if (!clusterClasses.ContainsKey(labels[i]))
                    {
                        clusterClasses.Add(labels[i], new Dictionary <int, int>());
                    }
                    int label = trainLabels.Data[i, 0];
                    if (!clusterClasses[labels[i]].ContainsKey(label))
                    {
                        clusterClasses[labels[i]].Add(label, 0);
                    }
                    clusterClasses[labels[i]][label]++;
                }

                return(true);
            }
            else
            {
                return(true);
            }
        }
예제 #12
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);
            }
        }