SHOGUN  v2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MulticlassLabels.cpp
Go to the documentation of this file.
4 
5 using namespace shogun;
6 
8 {
11 }
12 
13 CMulticlassLabels::CMulticlassLabels(int32_t num_labels) : CDenseLabels(num_labels)
14 {
16  m_num_multiclass_confidences = num_labels;
17  for (int32_t i=0; i<num_labels; i++)
19 }
20 
22 {
23  set_labels(src);
26 }
27 
29 {
32 }
33 
35 {
36  for (int32_t i=0; i<m_num_multiclass_confidences; i++)
39 }
40 
42 {
43  m_multiclass_confidences[i] = confidences;
44 }
45 
47 {
48  return m_multiclass_confidences[i];
49 }
50 
52 {
53  if ( base_labels->get_label_type() == LT_MULTICLASS )
54  return (CMulticlassLabels*) base_labels;
55  else
56  SG_SERROR("base_labels must be of dynamic type CMulticlassLabels");
57 
58  return NULL;
59 }
60 
61 void CMulticlassLabels::ensure_valid(const char* context)
62 {
64 
65  int32_t subset_size=get_num_labels();
66  for (int32_t i=0; i<subset_size; i++)
67  {
68  int32_t real_i = m_subset_stack->subset_idx_conversion(i);
69  int32_t label = int32_t(m_labels[real_i]);
70 
71  if (label<0 || float64_t(label)!=m_labels[real_i])
72  {
73  SG_ERROR("%s%sMulticlass Labels must be in range 0...<nr_classes-1> and integers!\n",
74  context?context:"", context?": ":"");
75  }
76  }
77 }
78 
80 {
81  return LT_MULTICLASS;
82 }
83 
85 {
86  SGVector<float64_t> binary_labels(get_num_labels());
87 
88  bool use_confidences = false;
90  {
91  if (m_multiclass_confidences[i].size())
92  use_confidences = true;
93  }
94  if (use_confidences)
95  {
96  for (int32_t k=0; k<binary_labels.vlen; k++)
97  {
99  int32_t label = get_int_label(k);
100  binary_labels[k] = label == i ? confs[label] : -confs[label];
101  }
102  }
103  else
104  {
105  for (int32_t k=0; k<binary_labels.vlen; k++)
106  {
107  int32_t label = get_int_label(k);
108  binary_labels[k] = label == i ? +1.0 : -1.0;
109  }
110  }
111  return new CBinaryLabels(binary_labels);
112 }
113 
115 {
116  /* extract all labels (copy because of possible subset) */
117  SGVector<float64_t> unique_labels=get_labels_copy();
118  unique_labels.vlen=SGVector<float64_t>::unique(unique_labels.vector, unique_labels.vlen);
119 
120  SGVector<float64_t> result(unique_labels.vlen);
121  memcpy(result.vector, unique_labels.vector,
122  sizeof(float64_t)*unique_labels.vlen);
123 
124  return result;
125 }
126 
127 
129 {
131  return unique.vlen;
132 }

SHOGUN Machine Learning Toolbox - Documentation