示例#1
0
        public void Train()
        {
            int datasetSize = _dataMgr.count;
            int dimension   = _dataMgr.inputNum;

            Node[][] inputs = new Node[datasetSize][];
            double[] labels = new double[datasetSize];

            int i = 0;
            int j = 0;

            for (i = 0; i < datasetSize; i++)
            {
                int index = i; // _rnd.Next(datasetSize - 1);
                inputs[i] = new Node[dimension];
                double[] input = _dataMgr.GetInputData(index);
                for (j = 0; j < dimension; j++)
                {
                    inputs[i][j]       = new Node();
                    inputs[i][j].Index = j;
                    inputs[i][j].Value = input[j];
                }

                if (_dataMgr.GetLabelData(index) < 0.5)
                {
                    labels[i] = -1;
                }
                else
                {
                    labels[i] = 1;
                }
            }

            Problem problem = new Problem(datasetSize, labels, inputs, dimension);

            //RangeTransform range = RangeTransform.Compute(problem);
            //problem = range.Scale(problem);

            Parameter param = new Parameter();

            param.C     = 2;
            param.Gamma = .5;
            //param.KernelType = KernelType.RBF;
            //param.SvmType = SvmType.C_SVC;

            _model           = new Model();
            _model.Parameter = param;

            bool[] nonzero = new bool[datasetSize];

            double[] alpha = new double[problem.Count];

            int l = problem.Count;

            double[] Minus_ones = new double[l];
            sbyte[]  y          = new sbyte[l];

            for (i = 0; i < l; i++)
            {
                alpha[i]      = 0;
                Minus_ones[i] = -1;
                if (problem.Y[i] > 0)
                {
                    y[i] = +1;
                }
                else
                {
                    y[i] = -1;
                }
            }

            Solver s = new Solver();

            Solver.SolutionInfo si = new Solver.SolutionInfo();
            s.Solve(l, new SVC_Q(problem, param, y), Minus_ones, y,
                    alpha, param.C, param.C, param.EPS, si, param.Shrinking);

            double sum_alpha = 0;

            for (i = 0; i < l; i++)
            {
                sum_alpha += alpha[i];
            }

            for (i = 0; i < l; i++)
            {
                alpha[i] *= y[i];
            }

            Procedures.decision_function f = new Procedures.decision_function();
            f.alpha = alpha;
            f.rho   = si.rho;

            // build output

            _model.NumberOfClasses = 2;
            _model.ClassLabels     = new int[2];
            _model.ClassLabels[0]  = 1;
            _model.ClassLabels[1]  = -1;

            _model.Rho    = new double[1];
            _model.Rho[0] = f.rho;

            _model.NumberOfSVPerClass = new int[2];
            int posCnt = 0, negCnt = 0;

            for (i = 0; i < datasetSize; i++)
            {
                if (labels[i] > 0)
                {
                    posCnt++;
                }
                else
                {
                    negCnt++;
                }
            }
            _model.NumberOfSVPerClass[0] = posCnt;
            _model.NumberOfSVPerClass[1] = negCnt;

            _model.SupportVectorCount           = datasetSize;
            _model.SupportVectors               = new Node[datasetSize][];
            _model.SupportVectorCoefficients    = new double[1][];
            _model.SupportVectorCoefficients[0] = new double[datasetSize];
            int p = 0;

            for (i = 0; i < datasetSize; i++)
            {
                _model.SupportVectors[p++]             = inputs[i];
                _model.SupportVectorCoefficients[0][i] = f.alpha[i];
            }

            //_model = Training.Train(problem, param);
        }