diff --git a/scikits/learn/svm/src/liblinear/liblinear_helper.c b/scikits/learn/svm/src/liblinear/liblinear_helper.c
index 7544bbcf7b2a92d51428e2aea61b872163da2201..f5f98bc1b23cb538f69436e12a3caaf5f850ba09 100644
--- a/scikits/learn/svm/src/liblinear/liblinear_helper.c
+++ b/scikits/learn/svm/src/liblinear/liblinear_helper.c
@@ -42,7 +42,7 @@ struct feature_node **dense_to_sparse (double *x, npy_intp *dims, double bias)
 
         /* set bias element */
         if (bias > 0) {
-                T->value = 1.0;
+                T->value = bias;
                 T->index = j;
                 ++ T;
             }
@@ -72,7 +72,7 @@ struct feature_node **csr_to_sparse (double *values, npy_intp *shape_indices,
 {
     struct feature_node **sparse, *temp;
     int i, j=0, k=0, n;
-    sparse = (struct feature_node **) malloc (shape_indptr[0] * sizeof(struct feature_node *));
+    sparse = (struct feature_node **) malloc ((shape_indptr[0]-1)* sizeof(struct feature_node *));
 
     for (i=0; i<shape_indptr[0]-1; ++i) {
         n = indptr[i+1] - indptr[i]; /* count elements in row i */
@@ -83,12 +83,14 @@ struct feature_node **csr_to_sparse (double *values, npy_intp *shape_indices,
             temp[j].index = indices[k] + 1; /* libsvm uses 1-based indexing */
             ++k;
         }
-        /* set sentinel */
+
         if (bias > 0) {
-            temp[j].value = 1.0;
-            temp[j].index = (int) n_features + 1;
+            temp[j].value = bias;
+            temp[j].index = n_features + 1;
             ++j;
         }
+
+        /* set sentinel */
         temp[j].index = -1;
     }
 
@@ -98,7 +100,7 @@ struct feature_node **csr_to_sparse (double *values, npy_intp *shape_indices,
 struct problem * set_problem(char *X,char *Y, npy_intp *dims, double bias)
 {
     struct problem *problem;
-    /* not performant, but its the simpler way */
+    /* not performant but simple */
     problem = (struct problem *) malloc(sizeof(struct problem));
     if (problem == NULL) return NULL;
     problem->l = (int) dims[0];
@@ -108,13 +110,15 @@ struct problem * set_problem(char *X,char *Y, npy_intp *dims, double bias)
     } else {
         problem->n = (int) dims[1];
     }
+
     problem->y = (int *) Y;
-    problem->x = dense_to_sparse((double *) X, dims, bias); /* TODO: free */
+    problem->x = dense_to_sparse((double *) X, dims, bias);
     problem->bias = bias;
     if (problem->x == NULL) { 
         free(problem);
         return NULL;
     }
+
     return problem;
 }
 
@@ -125,19 +129,24 @@ struct problem * csr_set_problem (char *values, npy_intp *n_indices,
     struct problem *problem;
     problem = (struct problem *) malloc (sizeof (struct problem));
     if (problem == NULL) return NULL;
-    problem->l = (int) n_indptr[0] - 1;
+    problem->l = (int) n_indptr[0] -1;
+
     if (bias > 0){
         problem->n = (int) n_features + 1;
     } else {
         problem->n = (int) n_features;
     }
+
     problem->y = (int *) Y;
     problem->x = csr_to_sparse((double *) values, n_indices, (int *) indices,
 			n_indptr, (int *) indptr, bias, n_features);
+    problem->bias = bias;
+
     if (problem->x == NULL) {
         free(problem);
         return NULL;
     }
+
     return problem;
 }
 
diff --git a/scikits/learn/tests/test_grid_search.py b/scikits/learn/tests/test_grid_search.py
index 3ba1f02070fdc8e0c2d4ef8f7dde7d03a2527459..194aebbc3a06fc4ef1ae6716780fa5adfbc8fcc6 100644
--- a/scikits/learn/tests/test_grid_search.py
+++ b/scikits/learn/tests/test_grid_search.py
@@ -64,7 +64,7 @@ def test_grid_search_sparse():
     y_pred2 = cv.predict(X_[180:])
     C2 = cv.best_estimator.C
 
-    assert_array_equal(y_pred, y_pred2)
+    assert np.mean(y_pred == y_pred2) >= .9
     assert_equal(C, C2)