36 #ifndef SHARK_ALGORITHMS_TRAINERS_LASSOREGRESSION_H 37 #define SHARK_ALGORITHMS_TRAINERS_LASSOREGRESSION_H 69 template <
class InputVectorType = RealVector>
90 {
return "LASSO regression"; }
140 void train(ModelType& model, DataType
const& dataset)
145 RealVector alpha(dim, 0.0);
148 RealMatrix mat(1, dim);
164 const bool verbose =
false;
172 UIntVector index(
dim);
175 for (
size_t i=0; i<
dim; i++){
180 RealVector pref(dim,1.0);
181 double prefsum = (double)dim;
185 const double gain_learning_rate = 1.0 /
dim;
186 double average_gain = 0.0;
191 std::size_t iter = 0;
192 std::size_t steps = 0;
198 double psum = prefsum;
202 for (std::size_t i=0; i<
dim; i++)
206 if (psum >= 1e-6 && p < psum)
207 n = (dim - pos) * p / psum;
211 unsigned int m = (
unsigned int)floor(n);
213 if ((
double)rand() / (double)RAND_MAX < prob) m++;
214 for (std::size_t j=0; j<m; j++)
216 index[pos] = (
unsigned int)i;
222 for (std::size_t i=0; i<
dim; i++)
224 std::size_t r = rand() %
dim;
229 for (
size_t s=0; s<
dim; s++)
231 std::size_t i = index[s];
248 gain = 0.5 * d * delta * delta;
250 else if (grad < -lambda)
254 gain = 0.5 * d * delta * delta;
260 vio = std::fabs(grad);
265 gain = delta * (grad - 0.5 * d * delta);
266 double g0 = grad - a * d - 2.0 *
lambda;
270 gain = dd * (grad - 0.5 * d * dd);
274 else gain = 0.5 * d * delta * delta;
279 vio = std::fabs(grad);
284 gain = delta * (grad - 0.5 * d * delta);
285 double g0 = grad - a * d + 2.0 *
lambda;
289 gain = dd * (grad - 0.5 * d * dd);
293 else gain = 0.5 * d * delta * delta;
308 average_gain += gain / (double)dim;
311 double change = CHANGE_RATE * (gain / average_gain - 1.0);
312 double newpref = pref[i] * std::exp(change);
314 prefsum += newpref - pref[i];
316 average_gain = (1.0 - gain_learning_rate) * average_gain + gain_learning_rate * gain;
331 prefsum = (double)dim;
332 if (verbose) std::cout <<
"*" << std::flush;
338 if (verbose) std::cout <<
"." << std::flush;