Пример #1
0
static void solve_nu_svr(
			 const svm_problem *prob, svm_parameter *param,
			 double *alpha, Solver::SolutionInfo* si)
{
  if(param->nu < 0 || param->nu > 1)
    {
      cerr << "specified nu is out of range\n";
      exit(1);
    }
  
  int l = prob->l;
  double C = param->C;
  double *alpha2 = new double[2*l];
  double *linear_term = new double[2*l];
  schar *y = new schar[2*l];
  int i;
  
  
  double sum = C * param->nu * l / 2;
  for(i=0;i<l;i++)
    {
      alpha2[i] = alpha2[i+l] = min(sum,C);
      sum -= alpha2[i];
      
      linear_term[i] = - prob->y[i];
      y[i] = 1;
      
      linear_term[i+l] = prob->y[i];
      y[i+l] = -1;
    }
  
  Solver_NU s;
  s.Solve(2*l, SVR_Q(*prob,*param), linear_term, y,
	  alpha2, C, C, param->eps, si, param->shrinking);
  
  info("epsilon = %f\n",-si->r);

  // output the value of epsilon
  param->p = -si->r;

  for(i=0;i<l;i++)
    alpha[i] = alpha2[i] - alpha2[i+l];
  
  delete[] alpha2;
  delete[] linear_term;
  delete[] y;
}
Пример #2
0
static void solve_nu_svr(
	const svm_problem *prob, const svm_parameter *param,
	double *alpha, Solver::SolutionInfo* si)
{
	int l = prob->l;
	double C = param->C;
	double *alpha2 = new double[2*l];
	double *linear_term = new double[2*l];
	schar *y = new schar[2*l];
	int i;

	double sum = C * param->nu * l / 2;
	for(i=0;i<l;i++)
	{
		alpha2[i] = alpha2[i+l] = min(sum,C);
		sum -= alpha2[i];

		linear_term[i] = - prob->y[i];
		y[i] = 1;

		linear_term[i+l] = prob->y[i];
		y[i+l] = -1;
	}

	Solver_NU s;
	s.Solve(2*l, SVR_Q(*prob,*param), linear_term, y,
		alpha2, C, C, param->eps, si, param->shrinking);

	info("epsilon = %f\n",-si->r);

	for(i=0;i<l;i++)
		alpha[i] = alpha2[i] - alpha2[i+l];

	delete[] alpha2;
	delete[] linear_term;
	delete[] y;
}
Пример #3
0
static void solve_epsilon_svr(
	const svm_problem *prob, const svm_parameter *param,
	double *alpha, Solver::SolutionInfo* si)
{
	int l = prob->l;
	double *alpha2 = new double[2*l];
	double *linear_term = new double[2*l];
	schar *y = new schar[2*l];
	int i;

	for(i=0;i<l;i++)
	{
		alpha2[i] = 0;
		linear_term[i] = param->p - prob->y[i];
		y[i] = 1;

		alpha2[i+l] = 0;
		linear_term[i+l] = param->p + prob->y[i];
		y[i+l] = -1;
	}

	Solver s;
	s.Solve(2*l, SVR_Q(*prob,*param), linear_term, y,
		alpha2, param->C, param->C, param->eps, si, param->shrinking);

	double sum_alpha = 0;
	for(i=0;i<l;i++)
	{
		alpha[i] = alpha2[i] - alpha2[i+l];
		sum_alpha += fabs(alpha[i]);
	}
	info("nu = %f\n",sum_alpha/(param->C*l));

	delete[] alpha2;
	delete[] linear_term;
	delete[] y;
}