diff --git a/src/ftrl.c b/src/ftrl.c index 8405730f..1dd02166 100644 --- a/src/ftrl.c +++ b/src/ftrl.c @@ -208,7 +208,7 @@ double ftrl_reg_cost(ftrl_trainer_t *self, double_matrix_t *theta, uint32_array if (row_idx >= i_start) { double *theta_i = double_matrix_get_row(theta, i); - l2_cost += double_array_l2_norm(theta_i, n); + l2_cost += double_array_sum_sq(theta_i, n); l1_cost += double_array_l1_norm(theta_i, n); } } diff --git a/src/stochastic_gradient_descent.c b/src/stochastic_gradient_descent.c index 19bca2a7..16e5f153 100644 --- a/src/stochastic_gradient_descent.c +++ b/src/stochastic_gradient_descent.c @@ -295,7 +295,7 @@ double stochastic_gradient_descent_reg_cost(sgd_trainer_t *self, uint32_array *u double *theta_i = double_matrix_get_row(theta, row); if (reg_type == REGULARIZATION_L2 && row >= i_start) { - cost += double_array_l2_norm(theta_i, n); + cost += double_array_sum_sq(theta_i, n); } else if (reg_type == REGULARIZATION_L1 && row >= i_start) { cost += double_array_l1_norm(theta_i, n); } diff --git a/src/vector_math.h b/src/vector_math.h index 14aaf7a1..ff9c017c 100644 --- a/src/vector_math.h +++ b/src/vector_math.h @@ -210,6 +210,14 @@ return sqrt((double)result); \ } \ \ + static inline unsigned_type name##_sum_sq(type *array, size_t n) { \ + unsigned_type result = 0; \ + for (size_t i = 0; i < n; i++) { \ + result += array[i] * array[i]; \ + } \ + return result; \ + } \ + \ static inline double name##_mean(type *array, size_t n) { \ unsigned_type sum = name##_sum(array, n); \ return (double)sum / n; \