43 #ifndef SHARK_ALGORITHMS_CSVMTRAINER_H 44 #define SHARK_ALGORITHMS_CSVMTRAINER_H 96 template <
class InputType,
class CacheType =
float>
98 InputType, unsigned int,
99 KernelClassifier<InputType>,
100 AbstractWeightedTrainer<KernelClassifier<InputType> >
129 CSvmTrainer(KernelType*
kernel,
double C,
bool offset,
bool unconstrained =
false,
bool computeDerivative =
true)
130 : base_type(kernel, C, offset, unconstrained), m_computeDerivative(computeDerivative)
139 CSvmTrainer(KernelType*
kernel,
double negativeC,
double positiveC,
bool offset,
bool unconstrained =
false)
140 : base_type(kernel,negativeC, positiveC, offset, unconstrained), m_computeDerivative(false)
145 {
return "CSvmTrainer"; }
183 template<
class T,
class DatasetTypeT>
186 trainInternal(km,svm,dataset);
190 template<
class T,
class DatasetTypeT>
197 trainInternal(km,svm,dataset);
201 trainInternal(km,svm,dataset);
206 template<
class Matrix,
class T>
212 optimize(svm,svmProblem,dataset);
218 optimize(svm,svmProblem,dataset);
224 template<
class Matrix,
class T>
232 optimize(svm,svmProblem,dataset.data());
240 optimize(svm,svmProblem,dataset.data());
247 template<
class SVMProblemType>
255 column(svm.
alpha(),0)= problem.getUnpermutedAlpha();
256 svm.
offset(0) = computeBias(problem,dataset);
264 column(svm.
alpha(),0) = problem.getUnpermutedAlpha();
267 RealVector m_db_dParams;
269 bool m_computeDerivative;
271 template<
class Problem>
274 m_db_dParams.resize(nkp+1);
275 m_db_dParams.clear();
277 std::size_t ic = problem.dimensions();
280 double lowerBound = -1e100;
281 double upperBound = 1e100;
283 std::size_t freeVars = 0;
284 std::size_t lower_i = 0;
285 std::size_t upper_i = 0;
286 for (std::size_t i=0; i<ic; i++)
288 double value = problem.gradient(i);
289 if (problem.alpha(i) == problem.boxMin(i))
291 if (value > lowerBound) {
296 else if (problem.alpha(i) == problem.boxMax(i))
298 if (value < upperBound) {
310 return sum / freeVars;
312 if(!m_computeDerivative)
313 return 0.5 * (lowerBound + upperBound);
315 lower_i = problem.permutation(lower_i);
316 upper_i = problem.permutation(upper_i);
322 double dlower_dC = 0.0;
323 double dupper_dC = 0.0;
326 RealVector dupper_dkernel( nkp,0 );
327 RealVector dlower_dkernel( nkp,0 );
330 RealVector der(nkp );
338 get( lowerInput, 0 ) = dataset.
element(lower_i).input;
339 get( upperInput, 0 ) = dataset.
element(upper_i).input;
340 RealMatrix one(1,1,1);
341 RealMatrix result(1,1);
343 for (std::size_t i=0; i<ic; i++) {
344 double cur_alpha = problem.alpha(problem.permutation(i));
345 if ( cur_alpha != 0 ) {
346 int cur_label = ( cur_alpha>0.0 ? 1 : -1 );
347 get( singleInput, 0 ) = dataset.
element(i).input;
350 dlower_dC += cur_label * result(0,0);
352 for ( std::size_t k=0; k<nkp; k++ ) {
353 dlower_dkernel(k) += cur_label * der(k);
357 dupper_dC += cur_label * result(0,0);
359 for ( std::size_t k=0; k<nkp; k++ ) {
360 dupper_dkernel(k) += cur_label * der(k);
365 m_db_dParams( nkp ) = -0.5 * ( dlower_dC + dupper_dC );
366 for ( std::size_t k=0; k<nkp; k++ ) {
367 m_db_dParams(k) = -0.5 * this->
C() * ( dlower_dkernel(k) + dupper_dkernel(k) );
370 m_db_dParams( nkp ) *= this->
C();
373 return 0.5 * (lowerBound + upperBound);
378 template <
class InputType>
389 {
return "LinearCSvmTrainer"; }
395 RealMatrix
w(1, dim, 0.0);
407 template <
class InputType,
class CacheType =
float>
426 : base_type(kernel, C, unconstrained)
435 : base_type(kernel,negativeC, positiveC, unconstrained)
440 {
return "SquaredHingeCSvmTrainer"; }
449 for(std::size_t i = 0; i != diagonalModifier.size();++i){
457 PrecomputedMatrixType matrix(&km);
462 CachedMatrixType matrix(&km);
472 template<
class Matrix>
475 SVMProblemType svmProblem(matrix,dataset.
labels(),1e100);
482 column(svm.
alpha(),0)= problem.getUnpermutedAlpha();
485 std::size_t freeVars = 0;
486 for (std::size_t i=0; i < problem.dimensions(); i++)
488 if(problem.alpha(i) > problem.boxMin(i) && problem.alpha(i) < problem.boxMax(i)){
489 sum += problem.gradient(i) - problem.alpha(i)*2*diagonalModifier(i);
494 svm.
offset(0) = sum / freeVars;
504 column(svm.
alpha(),0) = problem.getUnpermutedAlpha();
511 template <
class InputType>
522 {
return "SquaredHingeLinearCSvmTrainer"; }
528 RealMatrix
w(1, dim, 0.0);