[optimization] moving regularization methods to their own module

This commit is contained in:
Al
2017-04-03 00:16:30 -04:00
parent 957aa0c0c9
commit eff7a7a27a
2 changed files with 46 additions and 0 deletions

31
src/regularization.c Normal file
View File

@@ -0,0 +1,31 @@
#include "regularization.h"
#include "float_utils.h"
#include "log/log.h"
inline void regularize_l2(double *theta, size_t n, double reg_update) {
for (size_t i = 0; i < n; i++) {
double current_value = theta[i];
double updated_value = current_value - current_value * reg_update;
// Make sure the regularization update doesn't change the sign of the weight
// Otherwise, set the weight to 0
if ((updated_value > 0) == (current_value > 0)) {
theta[i] = updated_value;
} else {
theta[i] = 0.0;
}
}
}
inline void regularize_l1(double *theta, size_t n, double reg_update) {
for (size_t i = 0; i < n; i++) {
double current_value = theta[i];
double updated_value = current_value - sign(current_value) * reg_update;
// Make sure the regularization update doesn't change the sign of the weight
// Otherwise, set the weight to 0
if ((updated_value > 0) == (current_value > 0)) {
theta[i] = updated_value;
} else {
theta[i] = 0.0;
}
}
}

15
src/regularization.h Normal file
View File

@@ -0,0 +1,15 @@
#ifndef REGULARIZATION_H
#define REGULARIZATION_H
#include <stdlib.h>
typedef enum {
REGULARIZATION_NONE,
REGULARIZATION_L1,
REGULARIZATION_L2
} regularization_type_t;
void regularize_l2(double *theta, size_t n, double reg_update);
void regularize_l1(double *theta, size_t n, double reg_update);
#endif