From fef9972f3f611bdbff1e400ac286df9b8f8a91ed Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Mon, 5 Aug 2013 18:35:39 +0200 Subject: first completely working version --- src/libMSVMMaj.c | 78 +++++++++++++++++++++++++++++++------------------------ src/libMSVMMaj.o | Bin 67640 -> 0 bytes src/util.o | Bin 40096 -> 0 bytes 3 files changed, 44 insertions(+), 34 deletions(-) delete mode 100644 src/libMSVMMaj.o delete mode 100644 src/util.o (limited to 'src') diff --git a/src/libMSVMMaj.c b/src/libMSVMMaj.c index 3dc5e46..3d0436e 100644 --- a/src/libMSVMMaj.c +++ b/src/libMSVMMaj.c @@ -154,8 +154,8 @@ double get_msvmmaj_loss(struct Model *model, struct Data *data, double *ZV) value = matrix_get(model->H, K, i, j); value = pow(value, model->p); value *= matrix_get(model->R, K, i, j); + rowvalue += value; } - rowvalue += value; rowvalue = pow(rowvalue, 1.0/(model->p)); rowvalue *= model->rho[i]; loss += rowvalue; @@ -215,10 +215,11 @@ void main_loop(struct Model *model, struct Data *data) info("\tkappa = %f\n", model->kappa); info("\tp = %f\n", model->p); info("\tlambda = %15.16f\n", model->lambda); + info("\tepsilon = %g\n", model->epsilon); info("\n"); - info("Z:\n"); - print_matrix(data->Z, n, m+1); + //info("Z:\n"); + //print_matrix(data->Z, n, m+1); //info("Generating simplex\n"); simplex_gen(model->K, model->U); @@ -237,9 +238,10 @@ void main_loop(struct Model *model, struct Data *data) //info("Getting initial loss\n"); L = get_msvmmaj_loss(model, data, ZV); Lbar = L + 2.0*model->epsilon*L; - + info("Initial loss: %15.16f\n", L); while ((it < MAX_ITER) && (Lbar - L)/L > model->epsilon) { + /* info("################## Before %i ################\n", it); info("V:\n"); print_matrix(model->V, m+1, K-1); @@ -259,12 +261,12 @@ void main_loop(struct Model *model, struct Data *data) print_matrix(A, n, 1); info("B:\n"); print_matrix(B, n, K-1); - + */ // ensure V contains newest V and Vbar contains V from previous //info("Calculating update\n"); msvmmaj_update(model, data, ClassIdx, A, B, Omega, ZAZ, ZAZV, ZAZVT); - + /* info("################## After %i ################\n", it); info("V:\n"); print_matrix(model->V, m+1, K-1); @@ -284,7 +286,7 @@ void main_loop(struct Model *model, struct Data *data) print_matrix(A, n, 1); info("B:\n"); print_matrix(B, n, K-1); - + */ if (it > 50) step_doubling(model); @@ -305,6 +307,11 @@ void main_loop(struct Model *model, struct Data *data) for (j=0; jW, K-1, i-1, j, matrix_get(model->V, K-1, i, j)); + info("W:\n"); + print_matrix(model->W, m, K-1); + info("t:\n"); + print_matrix(model->t, K-1, 1); + info("I'm going to free some stuff ... "); info("0"); free(ClassIdx); @@ -402,14 +409,14 @@ void msvmmaj_update(struct Model *model, struct Data *data, //info("done\n"); //info("\tCalculating A and B ... "); - + b = 0; Memset(B, double, n*(K-1)); for (i=0; iQ, K, i, j); - if (q < -kappa) { + if (q <= -kappa) { a = 0.25/(0.5 - kappa/2.0 - q); b = 0.5; } else if (q <= 1.0) { @@ -429,10 +436,10 @@ void msvmmaj_update(struct Model *model, struct Data *data, if (2.0 - p < 0.0001) { for (j=0; jQ, K, i, j); - if (q < -kappa) { - b = 0.5*p*pow(0.5 - kappa/2.0 - q, p-1.0); + if (q <= -kappa) { + b = 0.5 - kappa/2.0 - q; } else if ( q <= 1.0) { - b = pow(1.0 - q, 3.0)/pow(2.0*kappa + 2.0, 2.0); + b = pow(1.0 - q, 3.0)/(2.0*pow(kappa + 1.0, 2.0)); } else { b = 0; } @@ -445,16 +452,19 @@ void msvmmaj_update(struct Model *model, struct Data *data, } else { for (j=0; jQ, K, i, j); - if (q < -kappa) { + if (q <= (p + kappa - 1.0)/(p - 2.0)) { a = 0.25*pow(p, 2.0)*pow(0.5 - kappa/2.0 - q, p - 2.0); - b = 0.5*p*pow(0.5 - kappa/2.0 - q, p - 1.0); - } else if ( q <= 1.0) { + } else if (q <= 1.0) { a = a2g2; - b = p*pow(1.0 - q, 2.0*p - 1.0)/pow(2*kappa+2.0, p); } else { - a = 0.25*pow(p, 2.0)*pow((p/(p - 2.0))*(0.5 - kappa/2.0 - q),p - 2.0); + a = 0.25*pow(p, 2.0)*pow((p/(p - 2.0))*(0.5 - kappa/2.0 - q), p - 2.0); b = a*(2.0*q + kappa - 1.0)/(p - 2.0) + 0.5*p*pow((p/(p - 2.0))*(0.5 - kappa/2.0 - q), p - 1.0); } + if (q <= -kappa) { + b = 0.5*p*pow(0.5 - kappa/2.0 - q, p - 1.0); + } else if ( q <= 1.0) { + b = p*pow(1.0 - q, 2.0*p - 1.0)/pow(2*kappa+2.0, p); + } for (k=0; kUU, K-1, K, i, k, j); matrix_add(B, K-1, i, k, Bvalue); @@ -493,19 +503,13 @@ void msvmmaj_update(struct Model *model, struct Data *data, //info("done\n"); // Copy upper to lower (necessary because we need to switch // to Col-Major order for LAPACK). - // - // TODO: this needs verification! It might also work without - // this step + /* for (i=0; i