aboutsummaryrefslogtreecommitdiff
path: root/src/gensvm_pred.c
diff options
context:
space:
mode:
authorGertjan van den Burg <burg@ese.eur.nl>2015-01-30 16:22:52 +0100
committerGertjan van den Burg <burg@ese.eur.nl>2015-01-30 16:22:52 +0100
commitdf9c3ca0b62f1a20071bee3a55d24d673c5d11e0 (patch)
treed3a2d6be5dfe6e2a4e248ad04dfdbb40852c8f7a /src/gensvm_pred.c
parentupdate documentation gensvm structs (diff)
downloadgensvm-df9c3ca0b62f1a20071bee3a55d24d673c5d11e0.tar.gz
gensvm-df9c3ca0b62f1a20071bee3a55d24d673c5d11e0.zip
first working version of new kernel GenSVM
Diffstat (limited to 'src/gensvm_pred.c')
-rw-r--r--src/gensvm_pred.c149
1 files changed, 35 insertions, 114 deletions
diff --git a/src/gensvm_pred.c b/src/gensvm_pred.c
index 88678d7..7baae07 100644
--- a/src/gensvm_pred.c
+++ b/src/gensvm_pred.c
@@ -12,6 +12,7 @@
*/
#include <cblas.h>
+#include <math.h>
#include "libGenSVM.h"
#include "gensvm.h"
@@ -19,19 +20,6 @@
#include "gensvm_matrix.h"
#include "gensvm_pred.h"
-#include "util.h" // testing
-
-void gensvm_predict_labels(struct GenData *data_test,
- struct GenData *data_train, struct GenModel *model,
- long *predy)
-{
- if (model->kerneltype == K_LINEAR)
- gensvm_predict_labels_linear(data_test, model, predy);
- else
- gensvm_predict_labels_kernel(data_test, data_train, model,
- predy);
-}
-
/**
* @brief Predict class labels of data given and output in predy
*
@@ -46,24 +34,40 @@ void gensvm_predict_labels(struct GenData *data_test,
* @param[in] model GenModel with optimized V
* @param[out] predy pre-allocated vector to record predictions in
*/
-void gensvm_predict_labels_linear(struct GenData *data,
- struct GenModel *model, long *predy)
+void gensvm_predict_labels(struct GenData *testdata, struct GenModel *model,
+ long *predy)
{
- long i, j, k, label;
- double norm, min_dist;
-
- long n = data->n; // note that model->n is the size of the training sample.
- long m = data->m;
- long K = model->K; //data->K does not necessarily equal the original K.
-
- double *S = Calloc(double, K-1);
- double *ZV = Calloc(double, n*(K-1));
- double *U = Calloc(double, K*(K-1));
+ long i, j, k, n, m, K, label;
+ double norm, min_dist, *S, *ZV, *U;
+
+ n = testdata->n;
+ m = testdata->r;
+ K = model->K;
+
+ // allocate necessary memory
+ S = Calloc(double, K-1);
+ if (S == NULL) {
+ fprintf(stderr, "Failed to allocate memory for S in "
+ "gensvm_predict_labels.\n");
+ exit(1);
+ }
+ ZV = Calloc(double, n*(K-1));
+ if (ZV == NULL) {
+ fprintf(stderr, "Failed to allocate memory for ZV in "
+ "gensvm_predict_labels.\n");
+ exit(1);
+ }
+ U = Calloc(double, K*(K-1));
+ if (U == NULL) {
+ fprintf(stderr, "Failed to allocate memory for U in "
+ "gensvm_predict_labels.\n");
+ exit(1);
+ }
- // Get the simplex matrix
+ // Generate the simplex matrix
gensvm_simplex_gen(K, U);
- // Generate the simplex-space vectors
+ // Generate the simplex space vectors
cblas_dgemm(
CblasRowMajor,
CblasNoTrans,
@@ -72,7 +76,7 @@ void gensvm_predict_labels_linear(struct GenData *data,
K-1,
m+1,
1.0,
- data->Z,
+ testdata->Z,
m+1,
model->V,
K-1,
@@ -81,96 +85,16 @@ void gensvm_predict_labels_linear(struct GenData *data,
K-1);
// Calculate the distance to each of the vertices of the simplex.
- // The closest vertex defines the class label.
+ // The closest vertex defines the class label
for (i=0; i<n; i++) {
label = 0;
- min_dist = 1000000000.0;
- for (j=0; j<K; j++) {
- for (k=0; k<K-1; k++) {
- S[k] = matrix_get(ZV, K-1, i, k) -
- matrix_get(U, K-1, j, k);
- }
- norm = cblas_dnrm2(K-1, S, 1);
- if (norm < min_dist) {
- label = j+1; // labels start counting from 1
- min_dist = norm;
- }
- }
- predy[i] = label;
- }
-
- free(ZV);
- free(U);
- free(S);
-}
-
-void gensvm_predict_labels_kernel(struct GenData *data_test,
- struct GenData *data_train, struct GenModel *model,
- long *predy)
-{
- long i, j, k, label;
- double norm, min_dist;
-
- long n_train = data_train->n;
- long n_test = data_test->n;
- long r = model->m;
- long K = model->K;
-
- double *K2 = NULL;
- gensvm_make_crosskernel(model, data_train, data_test, &K2);
-
- double *S = Calloc(double, K-1);
- double *ZV = Calloc(double, n_test*(r+1));
- double *KPS = Calloc(double, n_test*(r+1));
- double *U = Calloc(double, K*(K-1));
-
- gensvm_simplex_gen(K, U);
-
- // were doing the computations explicitly since P is included in
- // data_train->Z. Might want to look at this some more if it turns out
- // to be slow.
-
- double value, rowvalue;
- for (i=0; i<n_test; i++) {
- for (j=1; j<r+1; j++) {
- value = 0.0;
- for (k=0; k<n_train; k++) {
- rowvalue = matrix_get(K2, n_train, i, k);
- rowvalue *= matrix_get(data_train->Z, r+1, k,
- j);
- value += rowvalue;
- }
- value *= matrix_get(data_train->J, 1, j, 0);
- matrix_set(KPS, r+1, i, j, value);
- }
- matrix_set(KPS, r+1, i, 0, 1.0);
- }
-
- cblas_dgemm(
- CblasRowMajor,
- CblasNoTrans,
- CblasNoTrans,
- n_test,
- K-1,
- r+1,
- 1.0,
- KPS,
- r+1,
- model->V,
- K-1,
- 0.0,
- ZV,
- K-1);
-
- for (i=0; i<n_test; i++) {
- label = 0;
- min_dist = 1e10;
+ min_dist = INFINITY;
for (j=0; j<K; j++) {
for (k=0; k<K-1; k++) {
S[k] = matrix_get(ZV, K-1, i, k) -
matrix_get(U, K-1, j, k);
}
- norm = cblas_dnrm2(K, S, 1);
+ norm = cblas_dnrm2(K-1, S, 1);
if (norm < min_dist) {
label = j+1;
min_dist = norm;
@@ -182,9 +106,6 @@ void gensvm_predict_labels_kernel(struct GenData *data_test,
free(ZV);
free(U);
free(S);
- free(KPS);
- free(K2);
-
}
/**