35 #ifndef SHARK_ALGORITHMS_TRAINERS_MISSING_FEATURE_SVM_H 36 #define SHARK_ALGORITHMS_TRAINERS_MISSING_FEATURE_SVM_H 47 #include <boost/foreach.hpp> 73 template <
class InputType,
class CacheType =
float>
87 base_type(kernel, C, offset, unconstrained),
93 {
return "MissingFeatureSvmTrainer"; }
103 trainWithOffset(svm,dataset);
105 trainWithoutOffset(svm,dataset);
109 { m_maxIterations = newIterations; }
114 std::size_t m_maxIterations;
126 for(std::size_t iteration = 0; iteration != m_maxIterations; ++iteration){
133 kernelMatrix.setScalingCoefficients(scalingCoefficients);
134 CachedMatrixType matrix(&kernelMatrix);
135 SVMProblemType svmProblem(matrix,dataset.
labels(),this->
C());
141 RealVector alpha = problem.getUnpermutedAlpha();
144 const double classifierNorm = svm.
computeNorm(alpha, scalingCoefficients);
146 for (std::size_t i = 0; i < scalingCoefficients.size(); ++i)
157 if(iteration == m_maxIterations-1)
169 RealVector scalingCoefficients(datasetSize, 1.0);
175 for(std::size_t iteration = 0; iteration != m_maxIterations; ++iteration){
182 kernelMatrix.setScalingCoefficients(scalingCoefficients);
183 CachedMatrixType matrix(&kernelMatrix);
184 SVMProblemType svmProblem(matrix,dataset.
labels(),this->
C());
190 RealVector unpermutedAlpha = problem.getUnpermutedAlpha();
193 const double classifierNorm = svm.
computeNorm(unpermutedAlpha, scalingCoefficients);
195 for (std::size_t i = 0; i < scalingCoefficients.size(); ++i)
206 if(iteration == m_maxIterations-1){
210 double lowerBound = -1e100;
211 double upperBound = 1e100;
213 std::size_t freeVars = 0;
216 for (std::size_t i = 0; i < datasetSize; i++)
220 const double value = problem.gradient(i);
221 if (problem.alpha(i) == problem.boxMin(i)){
222 lowerBound =
std::max(value,lowerBound);
224 else if (problem.alpha(i) == problem.boxMax(i)){
225 upperBound =
std::min(value,upperBound);
235 svm.
offset(0) = sum / freeVars;
240 svm.
offset(0) = 0.5 * (lowerBound + upperBound);