SHOGUN
v2.0.0
Main Page
Related Pages
Modules
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
src
shogun
labels
MulticlassLabels.cpp
Go to the documentation of this file.
1
#include <
shogun/labels/DenseLabels.h
>
2
#include <
shogun/labels/BinaryLabels.h
>
3
#include <
shogun/labels/MulticlassLabels.h
>
4
5
using namespace
shogun;
6
7
CMulticlassLabels::CMulticlassLabels
() :
CDenseLabels
()
8
{
9
m_multiclass_confidences
= NULL;
10
m_num_multiclass_confidences
= 0;
11
}
12
13
CMulticlassLabels::CMulticlassLabels
(int32_t num_labels) :
CDenseLabels
(num_labels)
14
{
15
m_multiclass_confidences
=
SG_MALLOC
(
SGVector<float64_t>
, num_labels);
16
m_num_multiclass_confidences
= num_labels;
17
for
(int32_t i=0; i<num_labels; i++)
18
new
(&
m_multiclass_confidences
[i])
SGVector<float64_t>
();
19
}
20
21
CMulticlassLabels::CMulticlassLabels
(
const
SGVector<float64_t>
src) :
CDenseLabels
()
22
{
23
set_labels
(src);
24
m_multiclass_confidences
= NULL;
25
m_num_multiclass_confidences
= 0;
26
}
27
28
CMulticlassLabels::CMulticlassLabels
(
CFile
* loader) :
CDenseLabels
(loader)
29
{
30
m_multiclass_confidences
= NULL;
31
m_num_multiclass_confidences
= 0;
32
}
33
34
CMulticlassLabels::~CMulticlassLabels
()
35
{
36
for
(int32_t i=0; i<
m_num_multiclass_confidences
; i++)
37
m_multiclass_confidences
[i].~
SGVector<float64_t>
();
38
SG_FREE
(
m_multiclass_confidences
);
39
}
40
41
void
CMulticlassLabels::set_multiclass_confidences
(int32_t i,
SGVector<float64_t>
confidences)
42
{
43
m_multiclass_confidences
[i] = confidences;
44
}
45
46
SGVector<float64_t>
CMulticlassLabels::get_multiclass_confidences
(int32_t i)
47
{
48
return
m_multiclass_confidences
[i];
49
}
50
51
CMulticlassLabels
*
CMulticlassLabels::obtain_from_generic
(
CLabels
* base_labels)
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
{
63
CDenseLabels::ensure_valid
(context);
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
79
ELabelType
CMulticlassLabels::get_label_type
()
80
{
81
return
LT_MULTICLASS
;
82
}
83
84
CBinaryLabels
*
CMulticlassLabels::get_binary_for_class
(int32_t i)
85
{
86
SGVector<float64_t>
binary_labels(
get_num_labels
());
87
88
bool
use_confidences =
false
;
89
if
(
m_num_multiclass_confidences
!= 0)
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
{
98
SGVector<float64_t>
confs =
m_multiclass_confidences
[k];
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
114
SGVector<float64_t>
CMulticlassLabels::get_unique_labels
()
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
128
int32_t
CMulticlassLabels::get_num_classes
()
129
{
130
SGVector<float64_t>
unique=
get_unique_labels
();
131
return
unique.
vlen
;
132
}
SHOGUN
Machine Learning Toolbox - Documentation