예제 #1
0
파일: Training.cs 프로젝트: mlzboy/thrinax
		public static void Train(params string[] args)
		{
			Parameter parameters = default(Parameter);
			Problem problem = default(Problem);
			bool flag = default(bool);
			int nrfold = default(int);
			string filename = default(string);
			Training.parseCommandLine(args, out parameters, out problem, out flag, out nrfold, out filename);
			if (flag)
			{
				Training.PerformCrossValidation(problem, parameters, nrfold);
			}
			else
			{
				Model.Write(filename, Training.Train(problem, parameters));
			}
		}
예제 #2
0
        public static RegressionParameter[] GridRegression(Problem problem, Parameter parameters, List <double> CValues, List <double> GammaValues, List <double> PValues, string outputFile, int nrfold, int MaxBestCount)
        {
            if (!string.IsNullOrEmpty(outputFile))
            {
                File.WriteAllText(outputFile, string.Empty);
            }
            List <RegressionParameter> list = new List <RegressionParameter>(CValues.Count * GammaValues.Count * PValues.Count);

            for (int i = 0; i < CValues.Count; i++)
            {
                for (int j = 0; j < GammaValues.Count; j++)
                {
                    for (int k = 0; k < PValues.Count; k++)
                    {
                        parameters.C     = CValues[i];
                        parameters.Gamma = GammaValues[j];
                        parameters.P     = PValues[k];
                        double num = Math.Abs(Training.PerformCrossValidation(problem, parameters, nrfold));
                        Console.Write("{0} {1} {2} {3}", parameters.C, parameters.Gamma, parameters.P, num);
                        if (!string.IsNullOrEmpty(outputFile))
                        {
                            File.AppendAllText(outputFile, string.Format("{0} {1} {2} {3}\n", parameters.C, parameters.Gamma, parameters.P, num));
                        }
                        list.Add(new RegressionParameter(parameters.C, parameters.Gamma, parameters.P, num));
                    }
                }
            }
            list.Sort();
            if (MaxBestCount > 0)
            {
                int l;
                for (l = Math.Min(MaxBestCount, list.Count); l < list.Count && l < MaxBestCount * 3 && list[l - 1].SortValue == list[l].SortValue; l++)
                {
                }
                if (list.Count > l)
                {
                    list.RemoveRange(l, list.Count - l);
                }
                list.TrimExcess();
            }
            return(list.ToArray());
        }
예제 #3
0
        public static void GridRegression(Problem problem, Parameter parameters, List <double> CValues, List <double> GammaValues, List <double> PValues, string outputFile, int nrfold, out double C, out double Gamma, out double P)
        {
            C     = 0.0;
            Gamma = 0.0;
            P     = 0.0;
            double num = 1.7976931348623157E+308;

            if (!string.IsNullOrEmpty(outputFile))
            {
                File.WriteAllText(outputFile, string.Empty);
            }
            for (int i = 0; i < CValues.Count; i++)
            {
                for (int j = 0; j < GammaValues.Count; j++)
                {
                    for (int k = 0; k < PValues.Count; k++)
                    {
                        parameters.C     = CValues[i];
                        parameters.Gamma = GammaValues[j];
                        parameters.P     = PValues[k];
                        double num2 = Math.Abs(Training.PerformCrossValidation(problem, parameters, nrfold));
                        Console.Write("{0} {1} {2} {3}", parameters.C, parameters.Gamma, parameters.P, num2);
                        if (!string.IsNullOrEmpty(outputFile))
                        {
                            File.AppendAllText(outputFile, string.Format("{0} {1} {2} {3}\n", parameters.C, parameters.Gamma, parameters.P, num2));
                        }
                        if (num2 < num)
                        {
                            C     = parameters.C;
                            Gamma = parameters.Gamma;
                            P     = parameters.P;
                            num   = num2;
                            Console.WriteLine(" New Min!");
                        }
                        else
                        {
                            Console.WriteLine();
                        }
                    }
                }
            }
        }
예제 #4
0
        public static void Grid(Problem problem, Parameter parameters, List <double> CValues, List <double> GammaValues, string outputFile, int nrfold, out double C, out double Gamma)
        {
            C     = 0.0;
            Gamma = 0.0;
            double num = -1.7976931348623157E+308;

            if (!string.IsNullOrEmpty(outputFile))
            {
                File.WriteAllText(outputFile, string.Empty);
            }
            for (int i = 0; i < CValues.Count; i++)
            {
                for (int j = 0; j < GammaValues.Count; j++)
                {
                    parameters.C     = CValues[i];
                    parameters.Gamma = GammaValues[j];
                    double num2 = Training.PerformCrossValidation(problem, parameters, nrfold);
                    Console.Write("{0} {1} {2}", parameters.C, parameters.Gamma, num2);
                    if (!string.IsNullOrEmpty(outputFile))
                    {
                        File.AppendAllText(outputFile, string.Format("{0} {1} {2}\n", parameters.C, parameters.Gamma, num2));
                    }
                    if (num2 > num)
                    {
                        C     = parameters.C;
                        Gamma = parameters.Gamma;
                        num   = num2;
                        Console.WriteLine(" New Maximum!");
                    }
                    else
                    {
                        Console.WriteLine();
                    }
                }
            }
        }
예제 #5
0
 private static double GridCompute(GridComputingParameter Para)
 {
     return(Training.PerformCrossValidation(Para.problem, Para.parameter, Para.nrfold));
 }
예제 #6
0
        public static int SmartGridRegression(Problem problem, Parameter parameter, double C_Start, double C_Multi, double Gamma_Start, double Gamma_Multi, double P_Start, double P_Multi, string outputFile, int nrfold, out double C, out double Gamma, out double P)
        {
            C     = C_Start;
            Gamma = Gamma_Start;
            P     = P_Start;
            double num = -1.7976931348623157E+308;

            if (!string.IsNullOrEmpty(outputFile))
            {
                File.WriteAllText(outputFile, string.Empty);
            }
            int num2 = 0;

            double[] array = new double[21]
            {
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                C_Start,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            };
            double[] array2 = new double[21]
            {
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                Gamma_Start,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            };
            double[] array3 = new double[21]
            {
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                P_Start,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            };
            for (int i = 0; i < 10; i++)
            {
                array[9 - i]   = array[10 - i] / C_Multi;
                array[11 + i]  = array[10 + i] * C_Multi;
                array2[9 - i]  = array2[10 - i] / Gamma_Multi;
                array2[11 + i] = array2[10 + i] * Gamma_Multi;
                array3[9 - i]  = array3[10 - i] / P_Multi;
                array3[11 + i] = array3[10 + i] / P_Multi;
            }
            double[,,] array4 = new double[21, 21, 21];
            Point3D point3D = new Point3D(10, 10, 10);

            Point3D[] array5 = ParameterSelection.FindNeedCompute(array4, point3D);
            while (array5.Length > 0)
            {
                for (int j = 0; j < array5.Length; j++)
                {
                    parameter.C     = array[array5[j].C];
                    parameter.Gamma = array2[array5[j].G];
                    parameter.P     = array3[array5[j].P];
                    double num3 = Training.PerformCrossValidation(problem, parameter, nrfold);
                    array4[array5[j].C, array5[j].G, array5[j].P] = num3;
                    Console.Write(string.Format("{0} {1} {2} {3}", array[array5[j].C], array2[array5[j].G], array3[array5[j].P], num3));
                    if (!string.IsNullOrEmpty(outputFile))
                    {
                        File.AppendAllText(outputFile, string.Format("{0} {1} {2} {3}\n", array[array5[j].C], array2[array5[j].G], array3[array5[j].P], num3));
                    }
                    if (num3 < num)
                    {
                        num       = num3;
                        point3D.C = array5[j].C;
                        point3D.G = array5[j].G;
                        point3D.P = array5[j].P;
                        C         = array[array5[j].C];
                        Gamma     = array2[array5[j].G];
                        P         = array3[array5[j].P];
                        Console.WriteLine(" New Min!");
                    }
                    else
                    {
                        Console.WriteLine();
                    }
                    num2++;
                }
                array5 = ParameterSelection.FindNeedCompute(array4, point3D);
            }
            return(num2);
        }
예제 #7
0
        public static int SmartGrid(Problem problem, Parameter parameters, double C_Start, double C_Multi, double Gamma_Start, double Gamma_Multi, string outputFile, int nrfold, out double C, out double Gamma, bool Parallel = true)
        {
            C     = C_Start;
            Gamma = Gamma_Start;
            double num = -1.7976931348623157E+308;

            if (!string.IsNullOrEmpty(outputFile))
            {
                File.WriteAllText(outputFile, string.Empty);
            }
            int num2 = 0;

            double[,] array = new double[21, 21];
            double[] array2 = new double[21]
            {
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                C_Start,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            };
            double[] array3 = new double[21]
            {
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                Gamma_Start,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0,
                0.0
            };
            for (int i = 0; i < 10; i++)
            {
                array2[9 - i]  = array2[10 - i] / C_Multi;
                array2[11 + i] = array2[10 + i] * C_Multi;
                array3[9 - i]  = array3[10 - i] / Gamma_Multi;
                array3[11 + i] = array3[10 + i] * Gamma_Multi;
            }
            Point p = new Point(10, 10);

            Point[] array4 = ParameterSelection.FindNeedCompute(array, p, TrendLineDirection.LeftBelow_to_RightHigh);
            while (array4.Length > 0)
            {
                Task <double>[] array5 = new Task <double> [array4.Length];
                if (Parallel)
                {
                    for (int j = 0; j < array4.Length; j++)
                    {
                        Parameter parameter = (Parameter)parameters.Clone();
                        parameter.C     = array2[array4[j].X];
                        parameter.Gamma = array3[array4[j].Y];
                        GridComputingParameter state = new GridComputingParameter(problem, parameter, nrfold);
                        array5[j] = new Task <double>((object obj) => ParameterSelection.GridCompute((GridComputingParameter)obj), state);
                        array5[j].Start();
                    }
                }
                for (int k = 0; k < array4.Length; k++)
                {
                    double num3;
                    if (Parallel)
                    {
                        num3 = array5[k].Result;
                    }
                    else
                    {
                        parameters.C     = array2[array4[k].X];
                        parameters.Gamma = array3[array4[k].Y];
                        num3             = Training.PerformCrossValidation(problem, parameters, nrfold);
                    }
                    array[array4[k].X, array4[k].Y] = num3;
                    Console.Write(string.Format("{0} {1} {2}", array2[array4[k].X], array3[array4[k].Y], num3));
                    if (!string.IsNullOrEmpty(outputFile))
                    {
                        File.AppendAllText(outputFile, string.Format("{0} {1} {2}\n", array2[array4[k].X], array3[array4[k].Y], num3));
                    }
                    if (num3 > num)
                    {
                        num   = num3;
                        p.X   = array4[k].X;
                        p.Y   = array4[k].Y;
                        C     = array2[array4[k].X];
                        Gamma = array3[array4[k].Y];
                        Console.WriteLine(" New Maximum!");
                    }
                    else
                    {
                        Console.WriteLine();
                    }
                    num2++;
                }
                array4 = ParameterSelection.FindNeedCompute(array, p, TrendLineDirection.LeftBelow_to_RightHigh);
            }
            return(num2);
        }