Exemplo n.º 1
0
        private NuSVMResult Train(double nu, string outputParams, StreamWriter sw)
        {
            NuSVMResult result;

            if (2 * trainingData.CalcLeastSamples(signMapping) < nu * trainingData.Samples + 1e-9)
            {
                double val     = 2.0 * trainingData.CalcLeastSamples(signMapping) / trainingData.Samples - 1e-9;
                string message = "The hyper-parameter nu must be smaller than 2 min{|m^+|,|m^-|} / m.";
                message += "In this case, nu must be smaller than " + val;
                result   = new NuSVMResult(message);
            }//if
            else
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                double eta = 2.0 / (nu * trainingData.Samples);
                reducedLO.ResetEta(eta);
                timer.Restart();
                wolfeMNP.CalcMinimumNormPoint();
                timer.Stop();
                result = new NuSVMResult(trainingData.Samples, Features, nu, timer.ElapsedMilliseconds, wolfeMNP.Iteration, wolfeMNP.X, wolfeMNP.Data, wolfeMNP.Lambdas, trainingData, testingData,
                                         (kernelOption == 0 ? null : ((ReducedLinearOptimizationKernel)reducedLO).KernelMatrix),
                                         (kernelOption == 0?null:((ReducedLinearOptimizationKernel)reducedLO).Kernel)
                                         );
                if (testingData != null && sw != null)
                {
                    Predict(result, trainingData, testingData, result.W, result.B, sw, signMapping
                            , (kernelOption == 0 ? null : ((ReducedLinearOptimizationKernel)reducedLO).Kernel));
                }
            }//else
            result.Output(outputParams, sw);
            return(result);
        }
Exemplo n.º 2
0
        internal static void Predict(NuSVMResult result, DataSet trainingData, DataSet testingData, double[] w, double b, StreamWriter sw, Dictionary <int, int> signMapping, Func <Data, Data, double> kernel)
        {
            int[] signs = new int[signMapping.Count];
            foreach (var pair in signMapping)
            {
                signs[pair.Value] = pair.Key;
            }//foreach pair
            long correct = 0;
            long all     = 0;

            foreach (var data in testingData)
            {
                double value = b;
                if (kernel == null)
                {
                    for (int i = 0; i < data.Length; i++)
                    {
                        value += w[data.GetKey(i)] * data.GetValue(i);
                    }
                }
                else
                {
                    for (int i = 0; i < w.Length; i++)
                    {
                        value += w[i] * (data.Label == signs[1] ? -1 : 1) * kernel.Invoke(data, trainingData[i]);
                    }
                }
                int lable = (value >= 0 ? signs[0] : signs[1]);
                if (lable == data.Label)
                {
                    correct++;
                }
                result.Labels[all] = lable;
                all++;
            }//foreach data
            result.CorrectSize = correct;
            result.TestSize    = all;
        }