[mlpack-svn] r16048 - mlpack/trunk/src/mlpack/methods/logistic_regression
fastlab-svn at coffeetalk-1.cc.gatech.edu
fastlab-svn at coffeetalk-1.cc.gatech.edu
Wed Nov 20 11:37:31 EST 2013
Author: rcurtin
Date: Wed Nov 20 11:37:31 2013
New Revision: 16048
Log:
Refactor functions so that they do not expect the extra column of ones for the
intercept term.
Modified:
mlpack/trunk/src/mlpack/methods/logistic_regression/logistic_regression_function.cpp
Modified: mlpack/trunk/src/mlpack/methods/logistic_regression/logistic_regression_function.cpp
==============================================================================
--- mlpack/trunk/src/mlpack/methods/logistic_regression/logistic_regression_function.cpp (original)
+++ mlpack/trunk/src/mlpack/methods/logistic_regression/logistic_regression_function.cpp Wed Nov 20 11:37:31 2013
@@ -56,8 +56,10 @@
arma::dot(parameters.col(0).subvec(1, parameters.n_elem - 1),
parameters.col(0).subvec(1, parameters.n_elem - 1));
- // Calculate vectors of sigmoids.
- const arma::vec exponents = predictors.t() * parameters;
+ // Calculate vectors of sigmoids. The intercept term is parameters(0, 0) and
+ // does not need to be multiplied by any of the predictors.
+ const arma::vec exponents = parameters(0, 0) + predictors.t() *
+ parameters.col(0).subvec(1, parameters.n_elem - 1);
const arma::vec sigmoid = 1.0 / (1.0 + arma::exp(-exponents));
// Assemble full objective function. Often the objective function and the
@@ -92,8 +94,9 @@
parameters.col(0).subvec(1, parameters.n_elem - 1));
// Calculate sigmoid.
- const double sigmoid = 1.0 /
- (1.0 + std::exp(-arma::dot(predictors.col(i), parameters)));
+ const double exponent = parameters(0, 0) + arma::dot(predictors.col(i),
+ parameters.col(0).subvec(1, parameters.n_elem - 1));
+ const double sigmoid = 1.0 / (1.0 + std::exp(-exponent));
if (responses[i] == 1)
return -(log(sigmoid) + regularization);
@@ -106,13 +109,16 @@
arma::mat& gradient) const
{
// Regularization term.
- arma::mat regularization = arma::zeros<arma::mat>(predictors.n_rows, 1);
- regularization.rows(1, predictors.n_rows - 1) = lambda *
- parameters.col(0).subvec(1, predictors.n_rows - 1);
-
- gradient = -predictors * (responses
- - (1 / (1 + arma::exp(-predictors.t() * parameters))))
- - regularization;
+ arma::mat regularization;
+ regularization = lambda * parameters.col(0).subvec(1, parameters.n_elem - 1);
+
+ const arma::vec sigmoids = 1 / (1 + arma::exp(-parameters(0, 0)
+ - predictors.t() * parameters.col(0).subvec(1, parameters.n_elem - 1)));
+
+ gradient.set_size(parameters.n_elem);
+ gradient[0] = -arma::accu(responses - sigmoids);
+ gradient.col(0).subvec(1, parameters.n_elem - 1) = -predictors * (responses -
+ sigmoids) - regularization;
}
/**
@@ -125,12 +131,16 @@
arma::mat& gradient) const
{
// Calculate the regularization term.
- arma::mat regularization = arma::zeros<arma::mat>(predictors.n_rows, 1);
- regularization.rows(1, predictors.n_rows - 1) = lambda *
- parameters.col(0).subvec(1, predictors.n_rows - 1) / predictors.n_cols;
-
- const double sigmoid = 1.0 /
- (1.0 + std::exp(-arma::dot(predictors.col(i), parameters)));
-
- gradient = -predictors.col(i) * (responses[i] - sigmoid) - regularization;
+ arma::mat regularization;
+ regularization = lambda * parameters.col(0).subvec(1, parameters.n_elem - 1)
+ / predictors.n_cols;
+
+ const double sigmoid = 1.0 / (1.0 + std::exp(-parameters(0, 0)
+ - arma::dot(predictors.col(i), parameters.col(0).subvec(1,
+ parameters.n_elem - 1))));
+
+ gradient.set_size(parameters.n_elem);
+ gradient[0] = -(responses[i] - sigmoid);
+ gradient.col(0).subvec(1, parameters.n_elem - 1) = -predictors.col(i)
+ * (responses[i] - sigmoid) - regularization;
}
More information about the mlpack-svn
mailing list