From bb50c7ea2c5d9e3c294f37670319265e6f5eb7ef Mon Sep 17 00:00:00 2001 From: Al Date: Mon, 31 Aug 2015 20:27:58 -0400 Subject: [PATCH] [math] Adding sigmoid and softmax functions --- src/logistic.c | 36 ++++++++++++++++++++++++++++++++++++ src/logistic.h | 14 ++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/logistic.c create mode 100644 src/logistic.h diff --git a/src/logistic.c b/src/logistic.c new file mode 100644 index 00000000..223b15bc --- /dev/null +++ b/src/logistic.c @@ -0,0 +1,36 @@ +#include "logistic.h" +#include "vector_math.h" + +inline double sigmoid(double x) { + return 1.0/(1.0 + exp(-x)); +} + +inline void sigmoid_vector(double *x, size_t n) { + for (int i = 0; i < n; i++) { + x[i] = sigmoid(x[i]); + } +} + +inline void softmax_vector(double *x, size_t n) { + int i; + double sum = 0.0; + + double denom = double_array_log_sum_exp(x, n); + + for (i = 0; i < n; i++) { + x[i] = exp(x[i] - denom); + } +} + + +void softmax_matrix(matrix_t *matrix) { + size_t num_rows = matrix->m; + size_t num_cols = matrix->n; + + double *values = matrix->values; + + for (int i = 0; i < num_rows; i++) { + softmax_vector(values, num_cols); + values += num_cols; + } +} \ No newline at end of file diff --git a/src/logistic.h b/src/logistic.h new file mode 100644 index 00000000..ddb7de16 --- /dev/null +++ b/src/logistic.h @@ -0,0 +1,14 @@ +#ifndef LOGISTIC_H +#define LOGISTIC_H + +#include +#include + +#include "matrix.h" + +double sigmoid(double x); +void sigmoid_vector(double *x, size_t n); +void softmax_vector(double *x, size_t n); +void softmax_matrix(matrix_t *matrix); + +#endif \ No newline at end of file