diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gensvm_base.c | 6 | ||||
| -rw-r--r-- | src/gensvm_optimize.c | 53 |
2 files changed, 15 insertions, 44 deletions
diff --git a/src/gensvm_base.c b/src/gensvm_base.c index 7710fc9..2c30530 100644 --- a/src/gensvm_base.c +++ b/src/gensvm_base.c @@ -94,7 +94,6 @@ struct GenModel *gensvm_init_model() model->UU = NULL; model->Q = NULL; model->H = NULL; - model->R = NULL; model->rho = NULL; model->data_file = NULL; @@ -123,7 +122,6 @@ void gensvm_allocate_model(struct GenModel *model) model->UU = Calloc(double, n*K*(K-1)); model->Q = Calloc(double, n*K); model->H = Calloc(double, n*K); - model->R = Calloc(double, n*K); model->rho = Calloc(double, n); } @@ -156,9 +154,6 @@ void gensvm_reallocate_model(struct GenModel *model, long n, long m) model->H = Realloc(model->H, double, n*K); Memset(model->H, double, n*K); - model->R = Realloc(model->R, double, n*K); - Memset(model->R, double, n*K); - model->rho = Realloc(model->rho, double, n); Memset(model->rho, double, n); @@ -197,7 +192,6 @@ void gensvm_free_model(struct GenModel *model) free(model->Q); free(model->H); free(model->rho); - free(model->R); free(model->kernelparam); free(model->data_file); diff --git a/src/gensvm_optimize.c b/src/gensvm_optimize.c index 19e697e..d08f917 100644 --- a/src/gensvm_optimize.c +++ b/src/gensvm_optimize.c @@ -68,7 +68,7 @@ void gensvm_optimize(struct GenModel *model, struct GenData *data) gensvm_simplex(model->K, model->U); gensvm_simplex_diff(model, data); - gensvm_category_matrix(model, data); + gensvm_simplex(model); L = gensvm_get_loss(model, data, ZV); Lbar = L + 2.0*model->epsilon*L; @@ -141,9 +141,10 @@ double gensvm_get_loss(struct GenModel *model, struct GenData *data, rowvalue = 0; value = 0; for (j=0; j<K; j++) { + if (j == (data->y[i]-1)) + continue; value = matrix_get(model->H, K, i, j); value = pow(value, model->p); - value *= matrix_get(model->R, K, i, j); rowvalue += value; } rowvalue = pow(rowvalue, 1.0/(model->p)); @@ -181,16 +182,18 @@ double gensvm_get_loss(struct GenModel *model, struct GenData *data, * @returns the value of omega for instance i * */ -double gensvm_calculate_omega(struct GenModel *model, long i) +double gensvm_calculate_omega(struct GenModel *model, struct GenData *data, + long i) { long j; - double h, r, omega = 0.0, + double h, omega = 0.0, p = model->p; for (j=0; j<model->K; j++) { + if (j == (data->y[i]-1)) + continue; h = matrix_get(model->H, model->K, i, j); - r = matrix_get(model->R, model->K, i, j); - omega += pow(h, p)*r; + omega += pow(h, p); } omega = (1.0/p)*pow(omega, 1.0/p - 1.0); @@ -211,14 +214,16 @@ double gensvm_calculate_omega(struct GenModel *model, long i) * @returns whether or not we can do simple majorization * */ -bool gensvm_majorize_is_simple(struct GenModel *model, long i) +bool gensvm_majorize_is_simple(struct GenModel *model, struct GenData *data, + long i) { long j; - double h, r, value = 0; + double h, value = 0; for (j=0; j<model->K; j++) { + if (j == (data->y[i]-1)) + continue; h = matrix_get(model->H, model->K, i, j); - r = matrix_get(model->R, model->K, i, j); - value += (h*r > 0) ? 1 : 0; + value += (h > 0) ? 1 : 0; if (value > 1) return false; } @@ -572,34 +577,6 @@ void gensvm_get_update(struct GenModel *model, struct GenData *data, } /** - * @brief Generate the category matrix - * - * @details - * Generate the category matrix R. The category matrix has 1's everywhere - * except at the column corresponding to the label of instance i, there the - * element is 0. - * - * @param[in,out] model corresponding GenModel - * @param[in] dataset corresponding GenData - * - */ -void gensvm_category_matrix(struct GenModel *model, struct GenData *data) -{ - long i, j; - long n = model->n; - long K = model->K; - - for (i=0; i<n; i++) { - for (j=0; j<K; j++) { - if (data->y[i] != j+1) - matrix_set(model->R, K, i, j, 1.0); - else - matrix_set(model->R, K, i, j, 0.0); - } - } -} - -/** * @brief Generate the simplex difference matrix * * @details |
