54 init(num_labels, num_classes);
65 CMultilabelLabels::init(int32_t num_labels, int32_t num_classes)
67 REQUIRE(num_labels >= 0,
"num_labels=%d should be >= 0", num_labels);
68 REQUIRE(num_classes > 0,
"num_classes=%d should be > 0", num_classes);
100 SG_PRINT(
"m_labels[label_j=%d] not sorted: ", label_j);
105 "labels[%d] are not sorted!", label_j);
114 "first label labels[%d]=%d should be >= 0!",
115 label_j,
m_labels[label_j].vector[0]);
117 "last label labels[%d]=%d should be < num_classes == %d!",
140 for (int32_t label_j = 0; label_j <
m_num_labels; label_j++)
142 m_labels[label_j] = labels[label_j];
152 int32_t * num_label_idx =
157 num_label_idx[class_i] = 0;
162 for (int32_t c_pos = 0; c_pos <
m_labels[label_j].
vlen; c_pos++)
164 int32_t class_i =
m_labels[label_j][c_pos];
166 "class_i exceeded number of classes");
167 num_label_idx[class_i]++;
173 labels_list[class_i] =
176 SG_FREE(num_label_idx);
181 next_label_idx[class_i] = 0;
186 for (int32_t c_pos = 0; c_pos <
m_labels[label_j].
vlen; c_pos++)
189 int32_t class_i =
m_labels[label_j][c_pos];
191 "class_i exceeded number of classes");
193 int32_t l_pos = next_label_idx[class_i];
194 REQUIRE(l_pos < labels_list[class_i]->size(),
195 "l_pos exceeded length of label list");
196 next_label_idx[class_i]++;
198 (*labels_list[class_i])[l_pos] = label_j;
202 SG_FREE(next_label_idx);
217 "This function is valid only for multiclass multiple output lables.");
219 for (int32_t j=0; j<n_outputs; j++)
228 "label index j=%d should be within [%d,%d[",
234 template <
class S,
class D>
240 for (int32_t i = 0; i < sparse->
vlen; i++)
242 S index = (*sparse)[i];
244 "class index exceeded length of dense vector");
245 dense[index] = d_true;
263 "label index j=%d should be within [%d,%d[",
275 num_class_idx[label_j] = 0;
280 for (int32_t l_pos = 0; l_pos < labels_list[class_i]->
vlen; l_pos++)
282 int32_t label_j = (*labels_list[class_i])[l_pos];
284 "class_i=%d/%d :: label_j=%d/%d (l_pos=%d)\n",
287 num_class_idx[label_j]++;
295 SG_FREE(num_class_idx);
300 next_class_idx[label_j] = 0;
305 for (int32_t l_pos = 0; l_pos < labels_list[class_i]->
vlen; l_pos++)
308 int32_t label_j = (*labels_list[class_i])[l_pos];
310 "class_i=%d/%d :: label_j=%d/%d (l_pos=%d)\n",
315 int32_t c_pos = next_class_idx[label_j];
317 "c_pos exceeded length of labels vector");
318 next_class_idx[label_j]++;
324 SG_FREE(next_class_idx);
334 SG_PRINT(
"printing %d binary label vectors for %d multilabels:\n",
339 SG_PRINT(
" yC_{class_i=%d}", class_i);
341 to_dense <int32_t, float64_t> (labels_list[class_i],
344 delete labels_list[class_i];
346 SG_FREE(labels_list);
348 SG_PRINT(
"printing %d binary class vectors for %d labels:\n",
static SGVector< D > to_dense(SGVector< S > *sparse, int32_t dense_len, D d_true, D d_false)
SGMatrix< int32_t > get_labels() const
The class Labels models labels, i.e. class assignments of objects.
virtual int32_t get_num_labels() const
void set_class_labels(SGVector< int32_t > **labels_list)
void set_labels(SGVector< int32_t > *labels)
void display_vector(const char *name="vector", const char *prefix="") const
SGVector< int32_t > ** get_class_labels() const
virtual int32_t get_num_classes() const
SGVector< int32_t > get_label(int32_t j)
EMessageType get_loglevel() const
all of classes and functions are contained in the shogun namespace
void set_label(int32_t j, SGVector< int32_t > label)
void ensure_valid(const char *context=NULL)
SGVector< int32_t > * m_labels
void resize_vector(int32_t n)
static bool is_sorted(SGVector< T > vector)
void set_const(T const_elem)