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