diff --git a/src/mlpack/methods/logistic_regression/CMakeLists.txt b/src/mlpack/methods/logistic_regression/CMakeLists.txt index 79d5a64490..d1477ff713 100644 --- a/src/mlpack/methods/logistic_regression/CMakeLists.txt +++ b/src/mlpack/methods/logistic_regression/CMakeLists.txt @@ -2,10 +2,10 @@ # Anything not in this list will not be compiled into the output library # Do not include test programs here set(SOURCES - logistic_function.hpp - logistic_function_impl.hpp logistic_regression.hpp logistic_regression_impl.hpp + logistic_regression_function.hpp + logistic_regression_function_impl.hpp ) # add directory name to sources diff --git a/src/mlpack/methods/logistic_regression/logistic_regression.hpp b/src/mlpack/methods/logistic_regression/logistic_regression.hpp index 5285d1e258..93d6f692ec 100644 --- a/src/mlpack/methods/logistic_regression/logistic_regression.hpp +++ b/src/mlpack/methods/logistic_regression/logistic_regression.hpp @@ -11,7 +11,7 @@ #include #include -#include "logistic_function.hpp" +#include "logistic_regression_function.hpp" namespace mlpack { namespace regression { diff --git a/src/mlpack/methods/logistic_regression/logistic_function.hpp b/src/mlpack/methods/logistic_regression/logistic_regression_function.hpp similarity index 69% rename from src/mlpack/methods/logistic_regression/logistic_function.hpp rename to src/mlpack/methods/logistic_regression/logistic_regression_function.hpp index 149d96548e..ccc7a4ed57 100644 --- a/src/mlpack/methods/logistic_regression/logistic_function.hpp +++ b/src/mlpack/methods/logistic_regression/logistic_regression_function.hpp @@ -3,36 +3,31 @@ * @author Sumedh Ghaisas * * Implementation of the logistic regression function, which is meant to be - * optimized by a separate optimizer class that takes LogisticFunction + * optimized by a separate optimizer class that takes LogisticRegressionFunction * as its FunctionType class. */ -#ifndef __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_FUNCTION_HPP -#define __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_FUNCTION_HPP +#ifndef __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_REGRESSION_FUNCTION_HPP +#define __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_REGRESSION_FUNCTION_HPP #include namespace mlpack { namespace regression { -class LogisticFunction +class LogisticRegressionFunction { public: - LogisticFunction(arma::mat& predictors, + LogisticRegressionFunction(arma::mat& predictors, arma::vec& responses, const double lambda = 0); - LogisticFunction(arma::mat& predictors, + LogisticRegressionFunction(arma::mat& predictors, arma::vec& responses, const arma::mat& initialPoint, const double lambda = 0); arma::vec getSigmoid(const arma::vec& values) const; - //evaluates the logistic function with given parameters - double Evaluate(const arma::mat& predictors, - const arma::vec& responses, - const arma::mat& values) const; - //!Return the initial point const arma::mat& InitialPoint() const { return initialPoint; } //! Modify the initial point @@ -44,10 +39,7 @@ class LogisticFunction double& Lambda() { return lambda; } //functions to optimize by l-bfgs - double Evaluate(const arma::mat& values) const - { - return Evaluate(predictors, responses, values); - } + double Evaluate(const arma::mat& values) const; void Gradient(const arma::mat& values, arma::mat& gradient); @@ -77,4 +69,4 @@ class LogisticFunction }; // namespace regression }; // namespace mlpack -#endif // __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_FUNCTION_HPP +#endif // __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_REGRESSION_FUNCTION_HPP diff --git a/src/mlpack/methods/logistic_regression/logistic_function_impl.hpp b/src/mlpack/methods/logistic_regression/logistic_regression_function_impl.hpp similarity index 64% rename from src/mlpack/methods/logistic_regression/logistic_function_impl.hpp rename to src/mlpack/methods/logistic_regression/logistic_regression_function_impl.hpp index e4a6c7a203..604252b8d5 100644 --- a/src/mlpack/methods/logistic_regression/logistic_function_impl.hpp +++ b/src/mlpack/methods/logistic_regression/logistic_regression_function_impl.hpp @@ -2,10 +2,10 @@ * @file logistic_regression_function_impl.hpp * @author Sumedh Ghaisas * - * Implementation of hte LogisticFunction class. + * Implementation of hte LogisticRegressionFunction class. */ -#ifndef __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_FUNCTION_IMPL_HPP -#define __MLPACK_METHODS_LOGISTIC_REGRESSION_LOGISTIC_FUNCTION_IMPL_HPP +#ifndef __MLPACK_METHODS_LOGISTIC_REGRESSION_FUNCTION_IMPL_HPP +#define __MLPACK_METHODS_LOGISTIC_REGRESSION_FUNCTION_IMPL_HPP // In case it hasn't been done yet. #include "logistic_regression_function.hpp" @@ -13,7 +13,7 @@ namespace mlpack { namespace regression { -LogisticFunction::LogisticFunction( +LogisticRegressionFunction::LogisticRegressionFunction( arma::mat& predictors, arma::vec& responses, const double lambda) : @@ -24,7 +24,7 @@ LogisticFunction::LogisticFunction( initialPoint = arma::zeros(predictors.n_rows + 1, 1); } -LogisticFunction::LogisticFunction( +LogisticRegressionFunction::LogisticRegressionFunction( arma::mat& predictors, arma::vec& responses, const arma::mat& initialPoint, @@ -35,26 +35,25 @@ LogisticFunction::LogisticFunction( lambda(lambda) { //to check if initialPoint is compatible with predictors - if(initialPoint.n_rows != (predictors.n_rows + 1) || initialPoint.n_cols != 1) - this->initialPoint = arma::zeros(predictors.n_rows + 1,1); + if (initialPoint.n_rows != (predictors.n_rows + 1) || + initialPoint.n_cols != 1) + this->initialPoint = arma::zeros(predictors.n_rows + 1, 1); } -arma::vec LogisticFunction::getSigmoid(const arma::vec& values) const +arma::vec LogisticRegressionFunction::getSigmoid(const arma::vec& values, + arma::vec& output) const { arma::vec out = arma::ones(values.n_rows,1) / (arma::ones(values.n_rows,1) + arma::exp(-values)); return out; } -double LogisticFunction::Evaluate( - const arma::mat& predictors, - const arma::vec& responses, - const arma::mat& values) const +double LogisticRegressionFunction::Evaluate(const arma::mat& values) const { - size_t nCols = predictors.n_cols; + const size_t nCols = predictors.n_cols; //sigmoid = Sigmoid(X' * values) - arma::vec sigmoid = getSigmoid(arma::trans(predictors) * values); + arma::vec sigmoid = 1 / (1 + arma::exp(-(arma::trans(predictors) * values))); //l2-regularization(considering only values(2:end) in regularization arma::vec temp = arma::trans(values) * values; @@ -69,9 +68,8 @@ double LogisticFunction::Evaluate( predictors.n_cols + regularization; } -void LogisticFunction::Gradient( - const arma::mat& values, - arma::mat& gradient) +void LogisticRegressionFunction::Gradient(const arma::mat& values, + arma::mat& gradient) { //regularization arma::mat regularization = arma::zeros(predictors.n_rows, 1); @@ -79,8 +77,9 @@ void LogisticFunction::Gradient( values.rows(1, predictors.n_rows - 1) / responses.n_rows; //gradient = - gradient = -(predictors * (responses - getSigmoid(arma::trans(predictors) * - values))) / responses.n_rows + regularization; + gradient = -(predictors * (responses + - (1 / (1 + arma::exp(-(arma::trans(predictors) * values)))) + / responses.n_rows + regularization; } }; // namespace regression