13 using namespace shogun;
45 SG_ERROR(
"void glpkwrapper::setup(const int32_tnumkernels): input "
56 SG_ERROR(
"MKLMulticlassGradient::set_mkl_norm(float64_t norm) : parameter pnorm<1");
72 double pi4=3.151265358979238/4;
82 for(int32_t k=0; k< i+1 ;++k)
84 weights[k]*=cos( std::min(std::max(0.0,gammas[i]),pi4) );
86 weights[i+1]=sin( std::min(std::max(0.0,gammas[i]),pi4) );
93 weights[i]=pow(weights[i],2.0/
pnorm);
103 double pi4=3.151265358979238/2;
106 std::fill(gammagradient.begin(),gammagradient.end(),0.0);
115 for(int32_t k=0; k< std::min(i+1,dim+2) ;++k)
117 gammagradient[k]*=pow( cos( std::min(std::max(0.0,gammas[i]),pi4) ), 2.0/
pnorm) ;
120 gammagradient[i+1]=pow( sin( std::min(std::max(0.0,gammas[i]),pi4) ),2.0/
pnorm);
125 for(int32_t k=0; k< i+1 ;++k)
127 gammagradient[k]*= pow( cos( std::min(std::max(0.0,gammas[i]),pi4) ), 2.0/
pnorm-1.0)*(-1)*sin( std::min(std::max(0.0,gammas[i]),pi4) );
129 gammagradient[i+1]=pow( sin( std::min(std::max(0.0,gammas[i]),pi4) ),2.0/
pnorm-1)*cos( std::min(std::max(0.0,gammas[i]),pi4) );
160 int32_t maxhalfiter=20;
161 int32_t totaliters=6;
166 std::vector<float64_t> finalgamma,curgamma;
169 if(oldweights.empty())
171 std::fill(curgamma.begin(),curgamma.end(),pi4/2);
179 tmpbeta[i]=pow(oldweights[i],
pnorm/2);
184 curgamma[i-1]=asin(tmpbeta[i]);
187 if(cos(curgamma[i-1])>0)
188 tmpbeta[k]/=cos(curgamma[i-1]);
198 std::vector<float64_t> curbeta;
214 std::vector<float64_t> curgrad;
217 ::std::vector<float64_t> gammagradient;
220 curgrad.push_back(
objectives(gammagradient, minind));
223 std::vector<float64_t> maxalphas(numkernels-1,0);
225 for(int32_t i=0; i< numkernels-1 ;++i)
227 maxgrad=std::max(maxgrad,fabs(curgrad[i]) );
230 maxalphas[i]=(0-curgamma[i])/curgrad[i];
232 else if(curgrad[i]>0)
234 maxalphas[i]=(pi4-curgamma[i])/curgrad[i];
238 maxalphas[i]=1024*1024;
243 for(int32_t i=1; i< numkernels-1 ;++i)
245 maxalpha=std::min(maxalpha,maxalphas[i]);
248 if((maxalpha>1024*1023)|| (maxgrad<fingrad))
258 float64_t leftalpha=0, rightalpha=maxalpha, midalpha=(leftalpha+rightalpha)/2;
260 std::vector<float64_t> tmpgamma=curgamma, tmpbeta;
261 for(int32_t i=1; i< numkernels-1 ;++i)
263 tmpgamma[i]=tmpgamma[i]+rightalpha*curgrad[i];
269 curobj=std::min(curobj,
objectives(tmpbeta, i));
273 while((curobj < minval)&&(curhalfiter<maxhalfiter)&&(fabs(curobj/minval-1 ) > maxrelobjdiff ))
276 midalpha=(leftalpha+rightalpha)/2;
280 for(int32_t i=1; i< numkernels-1 ;++i)
282 tmpgamma[i]=tmpgamma[i]+rightalpha*curgrad[i];
288 curobj=std::min(curobj,
objectives(tmpbeta, i));
298 tmpobj=std::max(lobj,robj);
303 for(int32_t i=1; i< numkernels-1 ;++i)
305 tmpgamma[i]=tmpgamma[i]+midalpha*curgrad[i];
311 curobj=std::min(curobj,
objectives(tmpbeta, i));
324 midalpha=(leftalpha+rightalpha)/2;
328 while( fabs(curobj/tmpobj-1 ) > maxrelobjdiff );
333 if(longiters>= totaliters)
342 nor+=pow(finalbeta[i],
pnorm);
346 nor=pow(nor,1.0/
pnorm);
358 SG_ERROR(
"MKLMulticlassGradient::computeweights(std::vector<float64_t> & weights2) : parameter pnorm<1");
360 SG_SDEBUG(
"MKLMulticlassGradient::computeweights(...): pnorm %f\n",
pnorm);
362 int maxnumlinesrch=15;
365 bool finished =
false;
370 std::vector<float64_t> initw(weights2);
375 for(
size_t i=0;i<weights2.size();++i)
377 norm+=(weights2[i]-initw[i])*(weights2[i]-initw[i]);
386 if((norm < maxdiff) ||(numiter>=maxnumlinesrch ))
391 while(
false==finished);