[math] Generic dense matrix implementation using BLAS calls for matrix-matrix multiplication if available
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
#define NEAR_ZERO_WEIGHT 1e-6
|
||||
|
||||
bool logistic_regression_model_expectation(matrix_t *theta, sparse_matrix_t *x, matrix_t *p_y) {
|
||||
bool logistic_regression_model_expectation(double_matrix_t *theta, sparse_matrix_t *x, double_matrix_t *p_y) {
|
||||
if (theta == NULL || x == NULL || p_y == NULL) return false;
|
||||
|
||||
if (sparse_matrix_dot_dense(x, theta, p_y) != 0) {
|
||||
@@ -18,12 +18,12 @@ bool logistic_regression_model_expectation(matrix_t *theta, sparse_matrix_t *x,
|
||||
return true;
|
||||
}
|
||||
|
||||
double logistic_regression_cost_function(matrix_t *theta, sparse_matrix_t *x, uint32_array *y, matrix_t *p_y, double lambda) {
|
||||
double logistic_regression_cost_function(double_matrix_t *theta, sparse_matrix_t *x, uint32_array *y, double_matrix_t *p_y, double lambda) {
|
||||
size_t m = x->m;
|
||||
size_t n = x->n;
|
||||
if (m != y->n) return -1.0;
|
||||
|
||||
if (!matrix_resize(p_y, x->m, theta->n)) {
|
||||
if (!double_matrix_resize(p_y, x->m, theta->n)) {
|
||||
return -1.0;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ double logistic_regression_cost_function(matrix_t *theta, sparse_matrix_t *x, ui
|
||||
|
||||
for (size_t i = 0; i < p_y->m; i++) {
|
||||
uint32_t y_i = y->a[i];
|
||||
double value = matrix_get(p_y, i, y_i);
|
||||
double value = double_matrix_get(p_y, i, y_i);
|
||||
if (value > NEAR_ZERO_WEIGHT) {
|
||||
cost += log(value);
|
||||
}
|
||||
@@ -48,7 +48,7 @@ double logistic_regression_cost_function(matrix_t *theta, sparse_matrix_t *x, ui
|
||||
double reg_cost = 0.0;
|
||||
for (size_t i = 1; i < theta->m; i++) {
|
||||
for (size_t j = 0; j < theta->n; j++) {
|
||||
double theta_ij = matrix_get(theta, i, j);
|
||||
double theta_ij = double_matrix_get(theta, i, j);
|
||||
reg_cost += theta_ij * theta_ij;
|
||||
}
|
||||
|
||||
@@ -61,13 +61,13 @@ double logistic_regression_cost_function(matrix_t *theta, sparse_matrix_t *x, ui
|
||||
|
||||
}
|
||||
|
||||
static bool logistic_regression_gradient_params(matrix_t *theta, matrix_t *gradient, sparse_matrix_t *x, uint32_array *y, matrix_t *p_y,
|
||||
static bool logistic_regression_gradient_params(double_matrix_t *theta, double_matrix_t *gradient, sparse_matrix_t *x, uint32_array *y, double_matrix_t *p_y,
|
||||
uint32_array *x_cols, double lambda) {
|
||||
size_t m = x->m;
|
||||
size_t n = x->n;
|
||||
if (m != y->n) return false;
|
||||
|
||||
if (!matrix_resize(p_y, x->m, theta->n) || !matrix_resize(p_y, x->m, theta->n)) {
|
||||
if (!double_matrix_resize(p_y, x->m, theta->n) || !double_matrix_resize(p_y, x->m, theta->n)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -100,11 +100,11 @@ static bool logistic_regression_gradient_params(matrix_t *theta, matrix_t *gradi
|
||||
uint32_t *cols = x_cols->a;
|
||||
for (i = 0; i < batch_rows; i++) {
|
||||
col = cols[i];
|
||||
gradient_i = matrix_get_row(gradient, col);
|
||||
gradient_i = double_matrix_get_row(gradient, col);
|
||||
double_array_zero(gradient_i, num_classes);
|
||||
}
|
||||
} else {
|
||||
matrix_zero(gradient);
|
||||
double_matrix_zero(gradient);
|
||||
}
|
||||
|
||||
// gradient = -(1. / m) * x.T.dot(y - p_y) + lambda * theta
|
||||
@@ -133,7 +133,7 @@ static bool logistic_regression_gradient_params(matrix_t *theta, matrix_t *gradi
|
||||
}
|
||||
}
|
||||
} else {
|
||||
matrix_mul(gradient, scale);
|
||||
double_matrix_mul(gradient, scale);
|
||||
}
|
||||
|
||||
|
||||
@@ -166,12 +166,12 @@ static bool logistic_regression_gradient_params(matrix_t *theta, matrix_t *gradi
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool logistic_regression_gradient_sparse(matrix_t *theta, matrix_t *gradient, sparse_matrix_t *x, uint32_array *y, matrix_t *p_y,
|
||||
inline bool logistic_regression_gradient_sparse(double_matrix_t *theta, double_matrix_t *gradient, sparse_matrix_t *x, uint32_array *y, double_matrix_t *p_y,
|
||||
uint32_array *x_cols, double lambda) {
|
||||
return logistic_regression_gradient_params(theta, gradient, x, y, p_y, x_cols, lambda);
|
||||
}
|
||||
|
||||
|
||||
inline bool logistic_regression_gradient(matrix_t *theta, matrix_t *gradient, sparse_matrix_t *x, uint32_array *y, matrix_t *p_y, double lambda) {
|
||||
inline bool logistic_regression_gradient(double_matrix_t *theta, double_matrix_t *gradient, sparse_matrix_t *x, uint32_array *y, double_matrix_t *p_y, double lambda) {
|
||||
return logistic_regression_gradient_params(theta, gradient, x, y, p_y, NULL, lambda);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user