12 #ifndef MLPACK_METHODS_LOGISTIC_REGRESSION_FUNCTION_IMPL_HPP 13 #define MLPACK_METHODS_LOGISTIC_REGRESSION_FUNCTION_IMPL_HPP 21 namespace regression {
23 template<
typename MatType>
25 const MatType& predictors,
26 const arma::Row<size_t>& responses,
27 const double lambda) :
29 predictors(math::
MakeAlias(const_cast<MatType&>(predictors), false)),
30 responses(math::
MakeAlias(const_cast<
arma::Row<size_t>&>(responses),
35 if (responses.n_elem != predictors.n_cols)
37 Log::Fatal <<
"LogisticRegressionFunction::LogisticRegressionFunction(): " 38 <<
"predictors matrix has " << predictors.n_cols <<
" points, but " 39 <<
"responses vector has " << responses.n_elem <<
" elements (should be" 40 <<
" " << predictors.n_cols <<
")!" << std::endl;
47 template<
typename MatType>
50 MatType newPredictors;
51 arma::Row<size_t> newResponses;
60 predictors = std::move(newPredictors);
61 responses = std::move(newResponses);
68 template<
typename MatType>
70 const arma::mat& parameters)
const 81 const double regularization = 0.5 * lambda *
82 arma::dot(parameters.tail_cols(parameters.n_elem - 1),
83 parameters.tail_cols(parameters.n_elem - 1));
87 const arma::rowvec sigmoid = 1.0 / (1.0 + arma::exp(-(parameters(0, 0) +
88 parameters.tail_cols(parameters.n_elem - 1) * predictors)));
96 const double result = arma::accu(arma::log(1.0 -
97 arma::conv_to<arma::rowvec>::from(responses) + sigmoid %
98 (2 * arma::conv_to<arma::rowvec>::from(responses) - 1.0)));
101 return regularization - result;
108 template<
typename MatType>
110 const arma::mat& parameters,
112 const size_t batchSize)
const 115 const double regularization = lambda *
116 (batchSize / (2.0 * predictors.n_cols)) *
117 arma::dot(parameters.tail_cols(parameters.n_elem - 1),
118 parameters.tail_cols(parameters.n_elem - 1));
121 const arma::rowvec sigmoid = 1.0 / (1.0 + arma::exp(-(parameters(0, 0) +
122 parameters.tail_cols(parameters.n_elem - 1) *
123 predictors.cols(begin, begin + batchSize - 1))));
126 arma::rowvec respD = arma::conv_to<arma::rowvec>::from(responses.subvec(begin,
127 begin + batchSize - 1));
128 const double result = arma::accu(arma::log(1.0 - respD + sigmoid %
132 return regularization - result;
136 template<
typename MatType>
138 const arma::mat& parameters,
139 arma::mat& gradient)
const 142 arma::mat regularization;
143 regularization = lambda * parameters.tail_cols(parameters.n_elem - 1);
145 const arma::rowvec sigmoids = (1 / (1 + arma::exp(-parameters(0, 0)
146 - parameters.tail_cols(parameters.n_elem - 1) * predictors)));
148 gradient.set_size(arma::size(parameters));
149 gradient[0] = -arma::accu(responses - sigmoids);
150 gradient.tail_cols(parameters.n_elem - 1) = (sigmoids - responses) *
151 predictors.t() + regularization;
156 template<
typename MatType>
157 template<
typename GradType>
159 const arma::mat& parameters,
162 const size_t batchSize)
const 165 arma::mat regularization;
166 regularization = lambda * parameters.tail_cols(parameters.n_elem - 1)
167 / predictors.n_cols * batchSize;
169 const arma::rowvec exponents = parameters(0, 0) +
170 parameters.tail_cols(parameters.n_elem - 1) *
171 predictors.cols(begin, begin + batchSize - 1);
173 const arma::rowvec sigmoids = 1.0 / (1.0 + arma::exp(-exponents));
175 gradient.set_size(parameters.n_rows, parameters.n_cols);
176 gradient[0] = -arma::accu(responses.subvec(begin, begin + batchSize - 1) -
178 gradient.tail_cols(parameters.n_elem - 1) = (sigmoids -
179 responses.subvec(begin, begin + batchSize - 1)) *
180 predictors.cols(begin, begin + batchSize - 1).t() + regularization;
187 template <
typename MatType>
189 const arma::mat& parameters,
191 arma::sp_mat& gradient)
const 193 const arma::rowvec diffs = responses - (1 / (1 + arma::exp(-parameters(0, 0)
194 - parameters.tail_cols(parameters.n_elem - 1) * predictors)));
196 gradient.set_size(arma::size(parameters));
200 gradient[j] = -arma::accu(diffs);
204 gradient[j] = arma::dot(-predictors.row(j - 1), diffs) + lambda *
209 template<
typename MatType>
210 template<
typename GradType>
212 const arma::mat& parameters,
213 GradType& gradient)
const 216 arma::mat regularization = lambda *
217 parameters.tail_cols(parameters.n_elem - 1);
219 const double objectiveRegularization = lambda / 2.0 *
220 arma::dot(parameters.tail_cols(parameters.n_elem - 1),
221 parameters.tail_cols(parameters.n_elem - 1));
224 const arma::rowvec sigmoids = 1.0 / (1.0 + arma::exp(-(parameters(0, 0) +
225 parameters.tail_cols(parameters.n_elem - 1) * predictors)));
227 gradient.set_size(arma::size(parameters));
228 gradient[0] = -arma::accu(responses - sigmoids);
229 gradient.tail_cols(parameters.n_elem - 1) = (sigmoids - responses) *
230 predictors.t() + regularization;
233 double result = arma::accu(arma::log(1.0 -
234 arma::conv_to<arma::rowvec>::from(responses) + sigmoids %
235 (2 * arma::conv_to<arma::rowvec>::from(responses) - 1.0)));
238 return objectiveRegularization - result;
241 template<
typename MatType>
242 template<
typename GradType>
244 const arma::mat& parameters,
247 const size_t batchSize)
const 250 arma::mat regularization =
251 lambda * parameters.tail_cols(parameters.n_elem - 1) / predictors.n_cols *
254 const double objectiveRegularization = lambda *
255 (batchSize / (2.0 * predictors.n_cols)) *
256 arma::dot(parameters.tail_cols(parameters.n_elem - 1),
257 parameters.tail_cols(parameters.n_elem - 1));
260 const arma::rowvec sigmoids = 1.0 / (1.0 + arma::exp(-(parameters(0, 0) +
261 parameters.tail_cols(parameters.n_elem - 1) *
262 predictors.cols(begin, begin + batchSize - 1))));
264 gradient.set_size(parameters.n_rows, parameters.n_cols);
265 gradient[0] = -arma::accu(responses.subvec(begin, begin + batchSize - 1) -
267 gradient.tail_cols(parameters.n_elem - 1) = (sigmoids -
268 responses.subvec(begin, begin + batchSize - 1)) *
269 predictors.cols(begin, begin + batchSize - 1).t() + regularization;
272 arma::rowvec respD = arma::conv_to<arma::rowvec>::from(responses.subvec(begin,
273 begin + batchSize - 1));
274 const double result = arma::accu(arma::log(1.0 - respD + sigmoids %
278 return objectiveRegularization - result;
void Gradient(const arma::mat ¶meters, arma::mat &gradient) const
Evaluate the gradient of the logistic regression log-likelihood function with the given parameters...
Definition: logistic_regression_function_impl.hpp:137
static MLPACK_EXPORT util::PrefixedOutStream Fatal
Prints fatal messages prefixed with [FATAL], then terminates the program.
Definition: log.hpp:90
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
void PartialGradient(const arma::mat ¶meters, const size_t j, arma::sp_mat &gradient) const
Evaluate the gradient of the logistic regression log-likelihood function with the given parameters...
Definition: logistic_regression_function_impl.hpp:188
double Evaluate(const arma::mat ¶meters) const
Evaluate the logistic regression log-likelihood function with the given parameters.
Definition: logistic_regression_function_impl.hpp:69
double EvaluateWithGradient(const arma::mat ¶meters, GradType &gradient) const
Evaluate the objective function and gradient of the logistic regression log-likelihood function simul...
Definition: logistic_regression_function_impl.hpp:211
Include all of the base components required to write mlpack methods, and the main mlpack Doxygen docu...
void Shuffle()
Shuffle the order of function visitation.
Definition: logistic_regression_function_impl.hpp:48
void ShuffleData(const MatType &inputPoints, const LabelsType &inputLabels, MatType &outputPoints, LabelsType &outputLabels, const std::enable_if_t<!arma::is_SpMat< MatType >::value > *=0, const std::enable_if_t<!arma::is_Cube< MatType >::value > *=0)
Shuffle a dataset and associated labels (or responses).
Definition: shuffle_data.hpp:28
void ClearAlias(arma::Mat< ElemType > &mat)
Clear an alias so that no data is overwritten.
Definition: make_alias.hpp:110
arma::Cube< ElemType > MakeAlias(arma::Cube< ElemType > &input, const bool strict=true)
Make an alias of a dense cube.
Definition: make_alias.hpp:24
LogisticRegressionFunction(const MatType &predictors, const arma::Row< size_t > &responses, const double lambda=0)
Creates the LogisticRegressionFunction.
Definition: logistic_regression_function_impl.hpp:24