mlpack
cv_function_impl.hpp
Go to the documentation of this file.
1 
12 #ifndef MLPACK_CORE_HPT_CV_FUNCTION_IMPL_HPP
13 #define MLPACK_CORE_HPT_CV_FUNCTION_IMPL_HPP
14 
15 namespace mlpack {
16 namespace hpt {
17 
18 template<typename CVType,
19  typename MLAlgorithm,
20  size_t TotalArgs,
21  typename... BoundArgs>
22 template<size_t BoundArgIndex, size_t ParamIndex>
23 struct CVFunction<CVType, MLAlgorithm, TotalArgs, BoundArgs...>::UseBoundArg<
24  BoundArgIndex, ParamIndex, true>
25 {
26  using BoundArgType = typename
27  std::tuple_element<BoundArgIndex, std::tuple<BoundArgs...>>::type;
28 
29  static const bool value = BoundArgType::index == BoundArgIndex + ParamIndex;
30 };
31 
32 template<typename CVType,
33  typename MLAlgorithm,
34  size_t TotalArgs,
35  typename... BoundArgs>
36 template<size_t BoundArgIndex, size_t ParamIndex>
37 struct CVFunction<CVType, MLAlgorithm, TotalArgs, BoundArgs...>::UseBoundArg<
38  BoundArgIndex, ParamIndex, false>
39 {
40  static const bool value = false;
41 };
42 
43 template<typename CVType,
44  typename MLAlgorithm,
45  size_t TotalArgs,
46  typename... BoundArgs>
48  CVType& cv,
50  const double relativeDelta,
51  const double minDelta,
52  const BoundArgs&... args) :
53  cv(cv),
54  datasetInfo(datasetInfo),
55  boundArgs(args...),
56  bestObjective(std::numeric_limits<double>::max()),
57  relativeDelta(relativeDelta),
58  minDelta(minDelta)
59 { /* Nothing left to do. */ }
60 
61 template<typename CVType,
62  typename MLAlgorithm,
63  size_t TotalArgs,
64  typename... BoundArgs>
66  const arma::mat& parameters)
67 {
68  return Evaluate<0, 0>(parameters);
69 }
70 
71 template<typename CVType,
72  typename MLAlgorithm,
73  size_t TotalArgs,
74  typename... BoundArgs>
76  const arma::mat& parameters,
77  arma::mat& gradient)
78 {
79  gradient = arma::mat(arma::size(parameters));
80  arma::mat increasedParameters = parameters;
81  double originalParametersEvaluation = Evaluate(parameters);
82  for (size_t i = 0; i < parameters.n_rows; ++i)
83  {
84  double delta = std::max(std::abs(parameters(i)) * relativeDelta, minDelta);
85  increasedParameters(i) += delta;
86  gradient(i) =
87  (Evaluate(increasedParameters) - originalParametersEvaluation) / delta;
88  increasedParameters(i) = parameters(i);
89  }
90 }
91 
92 template<typename CVType,
93  typename MLAlgorithm,
94  size_t TotalArgs,
95  typename... BoundArgs>
96 template<size_t BoundArgIndex,
97  size_t ParamIndex,
98  typename... Args,
99  typename>
101  const arma::mat& parameters,
102  const Args&... args)
103 {
104  return PutNextArg<BoundArgIndex, ParamIndex>(parameters, args...);
105 }
106 
107 template<typename CVType,
108  typename MLAlgorithm,
109  size_t TotalArgs,
110  typename... BoundArgs>
111 template<size_t BoundArgIndex,
112  size_t ParamIndex,
113  typename... Args,
114  typename,
115  typename>
117  const arma::mat& /* parameters */,
118  const Args&... args)
119 {
120  double objective = cv.Evaluate(args...);
121 
122  // Change the best model if we have got a better score, or if we probably
123  // have not assigned any valid (trained) model yet.
124  if (bestObjective > objective ||
125  bestObjective == std::numeric_limits<double>::max())
126  {
127  bestObjective = objective;
128  bestModel = std::move(cv.Model());
129  }
130 
131  return objective;
132 }
133 
134 template<typename CVType,
135  typename MLAlgorithm,
136  size_t TotalArgs,
137  typename... BoundArgs>
138 template<size_t BoundArgIndex,
139  size_t ParamIndex,
140  typename... Args,
141  typename>
143  const arma::mat& parameters,
144  const Args&... args)
145 {
146  return Evaluate<BoundArgIndex + 1, ParamIndex>(
147  parameters, args..., std::get<BoundArgIndex>(boundArgs).value);
148 }
149 
150 template<typename CVType,
151  typename MLAlgorithm,
152  size_t TotalArgs,
153  typename... BoundArgs>
154 template<size_t BoundArgIndex,
155  size_t ParamIndex,
156  typename... Args,
157  typename,
158  typename>
160  const arma::mat& parameters,
161  const Args&... args)
162 {
163  if (datasetInfo.Type(ParamIndex) == data::Datatype::categorical)
164  {
165  return Evaluate<BoundArgIndex, ParamIndex + 1>(parameters, args...,
166  datasetInfo.UnmapString(size_t(parameters(ParamIndex, 0)), ParamIndex));
167  }
168  else
169  {
170  return Evaluate<BoundArgIndex, ParamIndex + 1>(parameters, args...,
171  parameters(ParamIndex, 0));
172  }
173 }
174 
175 } // namespace hpt
176 } // namespace mlpack
177 
178 #endif
Auxiliary information for a dataset, including mappings to/from strings (or other types) and the data...
Definition: dataset_mapper.hpp:41
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
Definition: pointer_wrapper.hpp:23
CVFunction(CVType &cv, data::DatasetMapper< data::IncrementPolicy, double > &datasetInfo, const double relativeDelta, const double minDelta, const BoundArgs &... args)
Initialize a CVFunction object.
Definition: cv_function_impl.hpp:47
double Evaluate(const arma::mat &parameters)
Run cross-validation with the bound and passed parameters.
Definition: cv_function_impl.hpp:65
void Gradient(const arma::mat &parameters, arma::mat &gradient)
Evaluate numerically the gradient of the CVFunction with the given parameters.
Definition: cv_function_impl.hpp:75
This wrapper serves for adapting the interface of the cross-validation classes to the one that can be...
Definition: cv_function.hpp:39