public void XORTest() { var range = Enumerable.Range(-10, 16); var log2gammas = range.Select(i => Math.Pow(2, i)); var log2Cs = range.Select(i => Math.Pow(2, i + 1)); var log2Rs = range.Select(i => Math.Pow(2, i + 1)); var prob = ProblemHelper.ReadProblem(XOR_TRAINING_FILE); //Assert.IsTrue(prob.l == 4); Tuple <double, double, double, int> best = Tuple.Create(0.0, 0.0, 0.0, prob.l); foreach (var g in log2gammas) { foreach (var c in log2Cs) { foreach (var r in log2Rs) { var svm = new C_SVC(prob, KernelHelper.SigmoidKernel(g, r), c); var errorCout = 0; for (int i = 0; i < prob.l; i++) { //var x = (prob.x[i].FirstOrDefault(xi => xi.index == 1) == null) ? 0.0 : prob.x[i].FirstOrDefault(xi => xi.index == 1).value; //var y = (prob.x[i].FirstOrDefault(xi => xi.index == 2) == null) ? 0.0 : prob.x[i].FirstOrDefault(xi => xi.index == 2).value; var z = svm.Predict(prob.x[i]); var probabilities = svm.PredictProbabilities(prob.x[i]); if (z != prob.y[i]) { errorCout++; } //Debug.WriteLine(String.Format("x={0} & y={1} => z={2} -- {3}", x, y, z, z == prob.y[i])); } if (errorCout < best.Item4) { best = Tuple.Create(g, c, r, errorCout); } //Debug.WriteLine(String.Format("g={0} && C={1} && C={2} => Error rate = {3}%", g, c, r, (double)errorCout / prob.l * 100)); } } } Debug.WriteLine(String.Format("BEST :: g={0} && C={1} && R={2} => Error rate = {3}%", best.Item1, best.Item2, best.Item3, (double)best.Item4 / (double)prob.l * 100)); }
static void Main(string[] args) { bool kernelparam = false; int numberofArgs = args.Length; string inputmatrix; string path = Directory.GetCurrentDirectory(); string save_model_name; string kerneltype; string testfile; /* SVM specific initializations */ int degree = 3; // default for none specified int r = 1; // C and gamma come from using grid.py on the training set resume.mat 982 x 7768 double C = 2.0; double gamma = 0.001953125; // used for Radial Basis Function Kernel (RBF) C_SVC svm; // setup the default variable for the SVM /* * Three parameters are required, kernel selection, training file and test file */ if (args.Length != 3) { Console.WriteLine(MyStrings.usage); System.Environment.Exit(1); } if (kernelparam = Int32.TryParse(args[0], out int kernelchoice) && kernelchoice <= 3) { //Legal value for kernelchoice are 0-3 //kernelchoice = 1; } else { // Not a legal kernel selection Console.WriteLine(MyStrings.usage); System.Environment.Exit(1); } inputmatrix = args[1]; testfile = args[2]; if (!HelperFunctions.CheckFormat(inputmatrix)) { Console.WriteLine(MyStrings.TrainingFileFormat, inputmatrix); System.Environment.Exit(1); } if (!File.Exists(testfile)) { Console.WriteLine(MyStrings.File_error, inputmatrix); System.Environment.Exit(1); } // Train the SVM switch (kernelchoice) { case 0: svm = new C_SVC(inputmatrix, KernelHelper.LinearKernel(), C); kerneltype = MyStrings.Linear; break; case 1: svm = new C_SVC(inputmatrix, KernelHelper.PolynomialKernel(degree, gamma, r), C); kerneltype = MyStrings.Polynomial; break; case 2: svm = new C_SVC(inputmatrix, KernelHelper.RadialBasisFunctionKernel(gamma), C); kerneltype = MyStrings.RBF; break; case 3: svm = new C_SVC(inputmatrix, KernelHelper.SigmoidKernel(gamma, r), C); kerneltype = MyStrings.Sigmoid; break; default: svm = new C_SVC(inputmatrix, KernelHelper.LinearKernel(), C); kerneltype = MyStrings.Linear; break; } // var accuracy = svm.GetCrossValidationAccuracy(5); save_model_name = String.Concat(inputmatrix, ".model"); svm.Export(save_model_name); var predfile = ProblemHelper.ReadProblem(testfile); double result = HelperFunctions.PredictTestSet(testfile, svm); Console.WriteLine(MyStrings.Accuracy, Math.Round(result * 100, 2)); Console.Write("SVM kernel type {0} ", kerneltype); Console.WriteLine(MyStrings.Parameters, C, gamma, degree, r); }
static void Main(string[] args) { List <double[]> continuousTrainData = DataWrangler.LoadContinuousDataAsync(TrainingCsv, _indexToIgnore).Result; List <double[]> continuousTestData = DataWrangler.LoadContinuousDataAsync(TestingCsv, _indexToIgnore).Result; // Print continuous columns for calculating elbows in external tool(https://bl.ocks.org/rpgove/0060ff3b656618e9136b) foreach (int i in _continuousIndexes) { using (StreamWriter sw = new StreamWriter($"{i}.txt")) { sw.WriteLine(string.Join(",", continuousTrainData.Select(array => array[i]))); } } // Convert continuous to discrete Dictionary <int, GaussianClusterCollection> indexClusterMapping = DataWrangler.GetIndexClustersMap(continuousTrainData, _indexElbowMap); List <int[]> discreteTrainData = DataWrangler.ConvertContinuesToDiscrete(continuousTrainData, indexClusterMapping); List <int[]> discreteTestData = DataWrangler.ConvertContinuesToDiscrete(continuousTestData, indexClusterMapping); var problem = ProblemHelper.ReadProblem(discreteTrainData.Select(arr => { // Move class to front as it is expected by libsvm. int temp = arr[0]; arr[SVMSupportedClassIndex] = arr[OriginalClassIndex]; arr[OriginalClassIndex] = temp; return(arr.Select(i => (double)i).ToList()); }).ToList()); var test = ProblemHelper.ReadProblem(discreteTestData.Select(arr => { // Move class to front as it is expected by libsvm. int temp = arr[0]; arr[SVMSupportedClassIndex] = arr[OriginalClassIndex]; arr[OriginalClassIndex] = temp; return(arr.Select(i => (double)i).ToList()); }).ToList()); // defaults taken from documentation http://weka.sourceforge.net/doc.stable/weka/classifiers/functions/LibSVM.html double c = 1; // default C is 1 double gamma = 1.0 / problem.l; // default gamma is 1/k double r = 0; // default coef0 is 0 int degree = 3; // default degree is 3 Dictionary <string, Kernel> nameKernelMap = new Dictionary <string, Kernel>(StringComparer.OrdinalIgnoreCase) { { "Linear", KernelHelper.LinearKernel() }, { "Polynomial", KernelHelper.PolynomialKernel(degree, gamma, r) }, { "Radial", KernelHelper.RadialBasisFunctionKernel(gamma) }, { "Sigmoid", KernelHelper.SigmoidKernel(gamma, r) }, }; // Get accuracies for base comparison // DON'T DO PARALLEL. We don't know if the underlying implementation is MT safe or not. //Parallel.ForEach(nameKernelMap.Keys, (kernelName) => foreach (string kernelName in nameKernelMap.Keys) { Console.WriteLine($"{kernelName}: {GetSVMAccuracy(problem, test, nameKernelMap[kernelName], c)}"); } ; // Get accuracy of with Naive Bayes double[] classWeightPrior = new[] { 1.0, 1.0 }; double[] classPriorProbability = new[] { 0.5, 0.5 }; NaiveBayesClassifier naiveBayes = NaiveBayesClassifier.Load(discreteTrainData, SVMSupportedClassIndex, classWeightPrior, classPriorProbability); Console.WriteLine($"Naive Bayes: {naiveBayes.GetPredictionAccuracy(discreteTestData, SVMSupportedClassIndex)}"); // Calculate SVMs Bias and Variance List <List <int[]> > samples = Sampler.SampleData(discreteTrainData, BiasVarianceNumOfSamples); ConcurrentDictionary <string, ConcurrentDictionary <int, ConcurrentDictionary <int, int> > > kernelInstanceClassifierPredictionsMappings = new ConcurrentDictionary <string, ConcurrentDictionary <int, ConcurrentDictionary <int, int> > >(StringComparer.OrdinalIgnoreCase); foreach (string kernelName in nameKernelMap.Keys) { ConcurrentDictionary <int, ConcurrentDictionary <int, int> > instanceClassifierPredictionMappings = kernelInstanceClassifierPredictionsMappings.GetOrAdd(kernelName, new ConcurrentDictionary <int, ConcurrentDictionary <int, int> >()); for (int classifierIndex = 0; classifierIndex < BiasVarianceNumOfSamples; classifierIndex++) { problem = ProblemHelper.ReadProblem(samples[classifierIndex].Select(arr => arr.Select(i => (double)i).ToList()).ToList()); var svm = new C_SVC(problem, nameKernelMap[kernelName], c); for (int instanceIndex = 0; instanceIndex < discreteTestData.Count; instanceIndex++) { ConcurrentDictionary <int, int> classifierPredictionMappings = instanceClassifierPredictionMappings.GetOrAdd(instanceIndex, new ConcurrentDictionary <int, int>()); test = ProblemHelper.ReadProblem(new List <List <double> > { discreteTestData[instanceIndex].Select(i => (double)i).ToList() }); for (int i = 0; i < test.l; i++) { var x = test.x[i]; var y = test.y[i]; classifierPredictionMappings.GetOrAdd(classifierIndex, (int)svm.Predict(x)); } } } } Console.WriteLine("Kernel, Bias, Variance, Accuracy"); foreach (string kernelName in nameKernelMap.Keys) { ConcurrentDictionary <int, ConcurrentDictionary <int, int> > instanceClassifierPredictionMappings = kernelInstanceClassifierPredictionsMappings.GetOrAdd(kernelName, new ConcurrentDictionary <int, ConcurrentDictionary <int, int> >()); Tuple <double, double, double> biasVarianceAccuracy = BiasVarianceHelper.GetBiasVarianceAccuracy(discreteTestData, SVMSupportedClassIndex, instanceClassifierPredictionMappings); Console.WriteLine($"{kernelName}, {biasVarianceAccuracy.Item1}, {biasVarianceAccuracy.Item2}, {biasVarianceAccuracy.Item3}"); } Console.WriteLine("Press ENTER to continue..."); Console.ReadLine(); }