37 #ifndef SHARK_ALGORITHMS_EPSILONSVMTRAINER_H 38 #define SHARK_ALGORITHMS_EPSILONSVMTRAINER_H 78 template <
class InputType,
class CacheType =
float>
100 : base_type(kernel, C, true, unconstrained)
106 {
return "EpsilonSvmTrainer"; }
109 {
return m_epsilon; }
117 RealVector ret(sp + 1);
141 trainSVM<PrecomputedBlockMatrixType>(svm,dataset);
143 trainSVM<CachedBlockMatrixType>(svm,dataset);
149 template<
class MatrixType>
156 std::size_t ic = km.size();
157 BlockMatrixType blockkm(&km);
159 SVMProblemType svmProblem(matrix);
160 for(std::size_t i = 0; i != ic; ++i){
161 svmProblem.linear(i) = dataset.
element(i).label(0) - m_epsilon;
162 svmProblem.linear(i+ic) = dataset.
element(i).label(0) + m_epsilon;
163 svmProblem.boxMin(i) = 0;
164 svmProblem.boxMax(i) = this->
C();
165 svmProblem.boxMin(i+ic) = -this->
C();
166 svmProblem.boxMax(i+ic) = 0;
173 RealVector alpha = problem.getUnpermutedAlpha();
177 double lowerBound = -1e100;
178 double upperBound = 1e100;
181 std::size_t freeVars = 0;
182 for (std::size_t i=0; i< ic; i++)
184 if (problem.alpha(i) > 0.0)
186 double value = problem.gradient(i);
187 if (problem.alpha(i) < this->
C())
194 lowerBound =
std::max(value,lowerBound);
197 if (problem.alpha(i + ic) < 0.0)
199 double value = problem.gradient(i + ic);
200 if (problem.alpha(i + ic) > -this->
C())
207 upperBound =
std::min(value,upperBound);
212 svm.
offset(0) = sum / freeVars;
214 svm.
offset(0) = 0.5 * (lowerBound + upperBound);