Exemple #1
0
        public static void testSVMPredictOnlyPackage()
        {
            string data_folder = @"D:\My_Dropbox\UProjects\OriBrainLearner\TestData\";
            string data_file   = data_folder + "svmguide1.t";
            string range_file  = data_folder + "svmguide1.range";
            string svm_file    = data_folder + "svmguide1.scale.model";

            GuiPreferences.Instance.setLog("THIS PACKAGE ONLY PREDICTS!");

            //Read in SVM model and feature range data
            LibSVM svm = new LibSVM(); svm.LoadModel(svm_file);
            double target_min, target_max; double[] features_min, features_max;

            LibSVM.ReadRange(range_file, out target_min, out target_max, out features_min, out features_max);

            //Read in Ground Truth data
            List <int>          labels_g = new List <int>();
            List <LibSVMNode[]> samples = new List <LibSVMNode[]>();

            using (StreamReader sr = new StreamReader(data_file))
            {
                string line; LibSVMNode[] sample; double label;
                while ((line = sr.ReadLine()) != null)
                {
                    LibSVM.ToLibSVMFormat(line, out sample, out label);
                    samples.Add(sample);
                    labels_g.Add((int)label);
                }
            }

            //Convert to Array and List format
            List <double[]>       samples_array = new List <double[]>();
            List <List <double> > samples_list = new List <List <double> >();

            for (int i = 0; i < samples.Count; i++)
            {
                LibSVMNode[]  sample      = samples[i];
                List <double> sample_list = new List <double>();
                for (int k = 0, l = 0; k < sample.Length; k++)
                {
                    int index = sample[k].index; if (index == -1)
                    {
                        break;
                    }
                    double value = sample[k].value;
                    for (int m = l; m < index - 1; m++)
                    {
                        sample_list.Add(double.NaN);
                    }
                    sample_list.Add(value); l = index;
                }
                samples_list.Add(sample_list);
                samples_array.Add(sample_list.ToArray());
            }

            int count; double[] probs, dec_values;

            //Scale the original data
            LibSVMNode[][] samples_scaled = new LibSVMNode[samples.Count][];
            GuiPreferences.Instance.setLog("Test scale data from SVMNode[] to SVMNode[]");
            for (int i = 0; i < samples.Count; i++)
            {
                samples_scaled[i] = LibSVM.ScaleData(samples[i], target_min, target_max, features_min, features_max);
            }
            GuiPreferences.Instance.setLog("Test Predict functions. ");
            count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.Predict(samples_scaled[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            GuiPreferences.Instance.setLog("Test scale data from double[] to SVMNode[]");
            for (int i = 0; i < samples_array.Count; i++)
            {
                samples_scaled[i] = LibSVM.ScaleData(samples_array[i], target_min, target_max, features_min, features_max);
            }
            GuiPreferences.Instance.setLog("Test Predict functions. ");
            count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.Predict(samples_scaled[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            GuiPreferences.Instance.setLog("Test scale data from list<double> to SVMNode[]");
            for (int i = 0; i < samples_list.Count; i++)
            {
                samples_scaled[i] = LibSVM.ScaleData(samples_list[i], target_min, target_max, features_min, features_max);
            }
            GuiPreferences.Instance.setLog("Test Predict functions. ");
            count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.Predict(samples_scaled[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            GuiPreferences.Instance.setLog("Test scale data from double[][] to SVMNode[][]");
            samples_scaled = LibSVM.ScaleData(samples_array.ToArray(), target_min, target_max, features_min, features_max);
            GuiPreferences.Instance.setLog("Test Predict functions. "); count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.Predict(samples_scaled[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            GuiPreferences.Instance.setLog("Test scale data from List<List<double>> to SVMNode[][]");
            samples_scaled = LibSVM.ScaleData(samples_list, target_min, target_max, features_min, features_max);
            GuiPreferences.Instance.setLog("Test Predict functions. "); count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.Predict(samples_scaled[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            //Convert scaled data to double[] and list<double> format
            List <double[]>       samples_scaled_array = new List <double[]>();
            List <List <double> > samples_scaled_list = new List <List <double> >();

            for (int i = 0; i < samples_scaled.Length; i++)
            {
                LibSVMNode[]  sample      = samples_scaled[i];
                List <double> sample_list = new List <double>();
                for (int k = 0, l = 0; k < sample.Length; k++)
                {
                    int index = sample[k].index; if (index == -1)
                    {
                        break;
                    }
                    double value = sample[k].value;
                    for (int m = l; m < index - 1; m++)
                    {
                        sample_list.Add(double.NaN);
                    }
                    sample_list.Add(value); l = index;
                }
                samples_scaled_list.Add(sample_list);
                samples_scaled_array.Add(sample_list.ToArray());
            }

            GuiPreferences.Instance.setLog("Test Predict(SVMNode[]) functions. "); count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.Predict(samples_scaled[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());


            GuiPreferences.Instance.setLog("Test Predict(List<double>) functions. "); count = 0;
            for (int i = 0; i < samples_scaled_list.Count; i++)
            {
                double label = svm.Predict(samples_scaled_list[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            GuiPreferences.Instance.setLog("Test Predict(double[]) functions. "); count = 0;
            for (int i = 0; i < samples_scaled_array.Count; i++)
            {
                double label = svm.Predict(samples_scaled_array[i]);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());

            GuiPreferences.Instance.setLog("Test PredictProb(SVMNode[]) functions. "); count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.PredictProb(samples_scaled[i], out probs);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());


            GuiPreferences.Instance.setLog("Test PredictProb(List<double>) functions. "); count = 0;
            for (int i = 0; i < samples_scaled_list.Count; i++)
            {
                double label = svm.PredictProb(samples_scaled_list[i], out probs);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());


            GuiPreferences.Instance.setLog("Test PredictProb(double[]) functions. "); count = 0;
            for (int i = 0; i < samples_scaled_array.Count; i++)
            {
                double label = svm.PredictProb(samples_scaled_array[i], out probs);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());


            GuiPreferences.Instance.setLog("Test PredictValues(SVMNode[]) functions. "); count = 0;
            for (int i = 0; i < samples_scaled.GetLength(0); i++)
            {
                double label = svm.PredictValues(samples_scaled[i], out dec_values);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());


            GuiPreferences.Instance.setLog("Test PredictValues(List<double>) functions. "); count = 0;
            for (int i = 0; i < samples_scaled_list.Count; i++)
            {
                double label = svm.PredictValues(samples_scaled_list[i], out dec_values);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());


            GuiPreferences.Instance.setLog("Test PredictValues(double[]) functions. "); count = 0;
            for (int i = 0; i < samples_scaled_array.Count; i++)
            {
                double label = svm.PredictValues(samples_scaled_array[i], out dec_values);
                if ((int)label == labels_g[i])
                {
                    count++;
                }
            }
            GuiPreferences.Instance.setLog("Accuracy = " + ((double)count / labels_g.Count).ToString());
        }