bug with negative class labels is fixed
authorP. Druzhkov <no@email>
Mon, 29 Nov 2010 21:58:52 +0000 (21:58 +0000)
committerP. Druzhkov <no@email>
Mon, 29 Nov 2010 21:58:52 +0000 (21:58 +0000)
modules/ml/src/gbt.cpp

index f0e00f2..2b8959f 100644 (file)
@@ -215,6 +215,7 @@ CvGBTrees::train( const CvMat* _train_data, int _tflag,
     cvCopy( _responses, orig_response);\r
     orig_response->step = CV_ELEM_SIZE(_responses->type);\r
 \r
+       /*\r
     if (!is_regression)\r
     {\r
         int max_label = -1;\r
@@ -231,6 +232,38 @@ CvGBTrees::train( const CvMat* _train_data, int _tflag,
             if (class_labels->data.i[i])\r
                 class_labels->data.i[i] = ++class_count;\r
     }\r
+       */\r
+       if (!is_regression)\r
+       {\r
+               class_count = 0;\r
+               unsigned char * mask = new unsigned char[get_len(orig_response)];\r
+               for (int i=0; i<get_len(orig_response); ++i)\r
+                       mask[i] = 0;\r
+               for (int i=0; i<get_len(orig_response); ++i)\r
+                       if (!mask[i])\r
+                       {\r
+                               class_count++;\r
+                               for (int j=i; j<get_len(orig_response); ++j)\r
+                                       if (int(orig_response->data.fl[j]) == int(orig_response->data.fl[i]))\r
+                                               mask[j] = 1;\r
+                       }\r
+               delete[] mask;\r
+       \r
+               class_labels = cvCreateMat(1, class_count, CV_32S);\r
+               class_labels->data.i[0] = int(orig_response->data.fl[0]);\r
+               int j = 1;\r
+               for (int i=1; i<get_len(orig_response); ++i)\r
+               {\r
+                       int k = 0;\r
+                       while ((int(orig_response->data.fl[i]) - class_labels->data.i[k]) && (k<j))\r
+                               k++;\r
+                       if (k == j)\r
+                       {\r
+                               class_labels->data.i[k] = int(orig_response->data.fl[i]);\r
+                               j++;\r
+                       }\r
+               }\r
+       }\r
 \r
     data->is_classifier = false;\r
 \r
@@ -443,8 +476,16 @@ void CvGBTrees::find_gradient(const int k)
                     exp_sfi += res;\r
                 }\r
                 int orig_label = int(resp_data[idx]);\r
+                               /*\r
                 grad_data[idx] = (float)(!(k-class_labels->data.i[orig_label]+1)) -\r
                                  (float)(exp_fk / exp_sfi);\r
+                               */\r
+                               int ensemble_label = 0;\r
+                               while (class_labels->data.i[ensemble_label] - orig_label)\r
+                                       ensemble_label++;                               \r
+                               \r
+                grad_data[idx] = (float)(!(k-ensemble_label)) -\r
+                                 (float)(exp_fk / exp_sfi);\r
             }\r
         }; break;\r
 \r
@@ -772,10 +813,13 @@ float CvGBTrees::predict( const CvMat* _sample, const CvMat* _missing,
 \r
     delete[] sum;\r
 \r
+       /*\r
     int orig_class_label = -1;\r
     for (int i=0; i<get_len(class_labels); ++i)\r
         if (class_labels->data.i[i] == class_label+1)\r
             orig_class_label = i;\r
+       */\r
+       int orig_class_label = class_labels->data.i[class_label];\r
 \r
     return float(orig_class_label);\r
 }\r