34 #ifndef DOXYGEN_SHOULD_SKIP_THIS
46 using namespace shogun;
69 l2r_lr_fun::~l2r_lr_fun()
77 double l2r_lr_fun::fun(
double *w)
88 double yz = y[i]*z[i];
90 f += C[i]*log(1 + exp(-yz));
92 f += C[i]*(-yz+log(1 + exp(yz)));
99 void l2r_lr_fun::grad(
double *w,
double *g)
104 int w_size=get_nr_variable();
108 z[i] = 1/(1 + exp(-y[i]*z[i]));
109 D[i] = z[i]*(1-z[i]);
110 z[i] = C[i]*(z[i]-1)*y[i];
114 for(i=0;i<w_size;i++)
118 int l2r_lr_fun::get_nr_variable()
123 void l2r_lr_fun::Hv(
double *s,
double *Hs)
127 int w_size=get_nr_variable();
132 wa[i] = C[i]*D[i]*wa[i];
135 for(i=0;i<w_size;i++)
136 Hs[i] = s[i] + Hs[i];
140 void l2r_lr_fun::Xv(
double *v,
double *res_Xv)
152 prob->x->dense_dot_range(res_Xv, 0, l, NULL, v, n, bias);
155 void l2r_lr_fun::XTv(
double *v,
double *res_XTv)
160 memset(res_XTv, 0,
sizeof(
double)*prob->n);
165 for (int32_t i=0;i<l;i++)
167 prob->x->add_to_dense_vec(v[i], i, res_XTv, n);
174 l2r_l2_svc_fun::l2r_l2_svc_fun(
const problem *p,
double Cp,
double Cn)
196 l2r_l2_svc_fun::~l2r_l2_svc_fun()
204 double l2r_l2_svc_fun::fun(
double *w)
210 int w_size=get_nr_variable();
225 void l2r_l2_svc_fun::grad(
double *w,
double *g)
230 int w_size=get_nr_variable();
236 z[sizeI] = C[i]*y[i]*(z[i]-1);
242 for(i=0;i<w_size;i++)
243 g[i] = w[i] + 2*g[i];
246 int l2r_l2_svc_fun::get_nr_variable()
251 void l2r_l2_svc_fun::Hv(
double *s,
double *Hs)
255 int w_size=get_nr_variable();
260 wa[i] = C[I[i]]*wa[i];
263 for(i=0;i<w_size;i++)
264 Hs[i] = s[i] + 2*Hs[i];
268 void l2r_l2_svc_fun::Xv(
double *v,
double *res_Xv)
280 prob->x->dense_dot_range(res_Xv, 0, l, NULL, v, n, bias);
283 void l2r_l2_svc_fun::subXv(
double *v,
double *res_Xv)
294 prob->x->dense_dot_range_subset(I, sizeI, res_Xv, NULL, v, n, bias);
305 void l2r_l2_svc_fun::subXTv(
double *v,
double *XTv)
312 memset(XTv, 0,
sizeof(
float64_t)*prob->n);
313 for (int32_t i=0;i<sizeI;i++)
315 prob->x->add_to_dense_vec(v[i], I[i], XTv, n);
340 #define GETI(i) (prob->y[i])
343 Solver_MCSVM_CS::Solver_MCSVM_CS(
const problem *p,
int n_class,
double *weighted_C,
double epsilon,
int max_it)
345 this->w_size = prob->n;
347 this->nr_class = n_class;
349 this->max_iter = max_it;
351 this->C = weighted_C;
356 Solver_MCSVM_CS::~Solver_MCSVM_CS()
362 int compare_double(
const void *a,
const void *b)
364 if(*(
double *)a > *(
double *)b)
366 if(*(
double *)a < *(
double *)b)
371 void Solver_MCSVM_CS::solve_sub_problem(
double A_i,
int yi,
double C_yi,
int active_i,
double *alpha_new)
378 qsort(D, active_i,
sizeof(
double), compare_double);
380 double beta = D[0] - A_i*C_yi;
381 for(r=1;r<active_i && beta<r*D[r];r++)
385 for(r=0;r<active_i;r++)
388 alpha_new[r] =
CMath::min(C_yi, (beta-B[r])/A_i);
390 alpha_new[r] =
CMath::min((
double)0, (beta - B[r])/A_i);
395 bool Solver_MCSVM_CS::be_shrunk(
int i,
int m,
int yi,
double alpha_i,
double minG)
400 if(alpha_i == bound && G[m] < minG)
405 void Solver_MCSVM_CS::Solve(
double *w)
409 double *alpha =
SG_MALLOC(
double, l*nr_class);
410 double *alpha_new =
SG_MALLOC(
double, nr_class);
414 double *d_val =
SG_MALLOC(
double, nr_class);
415 int *alpha_index =
SG_MALLOC(
int, nr_class*l);
419 double eps_shrink =
CMath::max(10.0*eps, 1.0);
420 bool start_from_all =
true;
422 for(i=0;i<l*nr_class;i++)
424 for(i=0;i<w_size*nr_class;i++)
428 for(m=0;m<nr_class;m++)
429 alpha_index[i*nr_class+m] = m;
431 QD[i] = prob->x->dot(i, prob->x,i);
433 active_size_i[i] = nr_class;
434 y_index[i] = prob->y[i];
438 while(iter < max_iter)
441 for(i=0;i<active_size;i++)
443 int j = i+rand()%(active_size-i);
446 for(s=0;s<active_size;s++)
450 double *alpha_i = &alpha[i*nr_class];
451 int *alpha_index_i = &alpha_index[i*nr_class];
455 for(m=0;m<active_size_i[i];m++)
457 if(y_index[i] < active_size_i[i])
474 for(m=0;m<active_size_i[i];m++)
476 if(alpha_i[alpha_index_i[m]] < 0 && G[m] < minG)
481 if(y_index[i] < active_size_i[i])
482 if(alpha_i[prob->y[i]] < C[
GETI(i)] && G[y_index[i]] < minG)
483 minG = G[y_index[i]];
485 for(m=0;m<active_size_i[i];m++)
487 if(be_shrunk(i, m, y_index[i], alpha_i[alpha_index_i[m]], minG))
490 while(active_size_i[i]>m)
492 if(!be_shrunk(i, active_size_i[i], y_index[i],
493 alpha_i[alpha_index_i[active_size_i[i]]], minG))
495 CMath::swap(alpha_index_i[m], alpha_index_i[active_size_i[i]]);
497 if(y_index[i] == active_size_i[i])
499 else if(y_index[i] == m)
500 y_index[i] = active_size_i[i];
508 if(active_size_i[i] <= 1)
516 if(maxG-minG <= 1e-12)
521 for(m=0;m<active_size_i[i];m++)
522 B[m] = G[m] - Ai*alpha_i[alpha_index_i[m]] ;
524 solve_sub_problem(Ai, y_index[i], C[
GETI(i)], active_size_i[i], alpha_new);
526 for(m=0;m<active_size_i[i];m++)
528 double d = alpha_new[m] - alpha_i[alpha_index_i[m]];
529 alpha_i[alpha_index_i[m]] = alpha_new[m];
532 d_ind[nz_d] = alpha_index_i[m];
556 if(stopping < eps_shrink)
558 if(stopping < eps && start_from_all ==
true)
564 active_size_i[i] = nr_class;
567 start_from_all =
true;
571 start_from_all =
false;
574 SG_SINFO(
"\noptimization finished, #iter = %d\n",iter);
575 if (iter >= max_iter)
576 SG_SINFO(
"Warning: reaching max number of iterations\n");
581 for(i=0;i<w_size*nr_class;i++)
584 for(i=0;i<l*nr_class;i++)
587 if(fabs(alpha[i]) > 0)
591 v -= alpha[i*nr_class+prob->y[i]];
592 SG_SINFO(
"Objective value = %lf\n",v);
601 delete [] alpha_index;
603 delete [] active_size_i;
610 void destroy_model(
struct model *model_)
617 void destroy_param(parameter* param)
623 #endif // DOXYGEN_SHOULD_SKIP_THIS