SHOGUN
v1.1.0
Main Page
Related Pages
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
src
shogun
features
Labels.cpp
Go to the documentation of this file.
1
/*
2
* This program is free software; you can redistribute it and/or modify
3
* it under the terms of the GNU General Public License as published by
4
* the Free Software Foundation; either version 3 of the License, or
5
* (at your option) any later version.
6
*
7
* Written (W) 1999-2009 Soeren Sonnenburg
8
* Written (W) 1999-2008 Gunnar Raetsch
9
* Subset support written (W) 2011 Heiko Strathmann
10
* Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
11
*/
12
13
#include <
shogun/features/Labels.h
>
14
#include <
shogun/lib/common.h
>
15
#include <
shogun/io/File.h
>
16
#include <
shogun/io/SGIO.h
>
17
#include <
shogun/mathematics/Math.h
>
18
#include <
shogun/base/Parameter.h
>
19
#include <
shogun/lib/Set.h
>
20
21
using namespace
shogun;
22
23
CLabels::CLabels
()
24
:
CSGObject
()
25
{
26
init();
27
}
28
29
CLabels::CLabels
(int32_t num_lab)
30
:
CSGObject
()
31
{
32
init();
33
labels
=
SGVector<float64_t>
(num_lab);
34
}
35
36
CLabels::CLabels
(
SGVector<float64_t>
src)
37
:
CSGObject
()
38
{
39
init();
40
41
set_labels
(src);
42
m_num_classes
=
get_num_classes
();
43
}
44
45
void
CLabels::set_to_one
()
46
{
47
ASSERT
(
labels
.
vector
);
48
index_t
subset_size=
get_num_labels
();
49
for
(int32_t i=0; i<subset_size; i++)
50
labels
.
vector
[
subset_idx_conversion
(i)]=+1;
51
}
52
53
CLabels::CLabels
(
CFile
* loader)
54
:
CSGObject
()
55
{
56
init();
57
load
(loader);
58
}
59
60
CLabels::~CLabels
()
61
{
62
labels
.
destroy_vector
();
63
delete
m_subset;
64
m_subset=NULL;
65
66
m_num_classes
=0;
67
}
68
69
void
CLabels::init()
70
{
71
m_parameters
->
add
(&
labels
,
"labels"
,
"The labels."
);
72
m_parameters
->
add
((
CSGObject
**)&m_subset,
"subset"
,
"Subset object"
);
73
74
labels
=
SGVector<float64_t>
();
75
m_num_classes
=0;
76
m_subset=NULL;
77
}
78
79
void
CLabels::set_labels
(
SGVector<float64_t>
v)
80
{
81
if
(m_subset)
82
SG_ERROR
(
"A subset is set, cannot set labels\n"
);
83
84
labels
.
free_vector
();
85
labels
=v;
86
labels
.
do_free
=
false
;
87
}
88
89
bool
CLabels::is_two_class_labeling
()
90
{
91
ASSERT
(
labels
.
vector
);
92
bool
found_plus_one=
false
;
93
bool
found_minus_one=
false
;
94
95
int32_t subset_size=
get_num_labels
();
96
for
(int32_t i=0; i<subset_size; i++)
97
{
98
int32_t real_i=
subset_idx_conversion
(i);
99
if
(
labels
.
vector
[real_i]==+1.0)
100
found_plus_one=
true
;
101
else
if
(
labels
.
vector
[real_i]==-1.0)
102
found_minus_one=
true
;
103
else
104
{
105
SG_ERROR
(
"Not a two class labeling label[%d]=%f (only +1/-1 "
106
"allowed)\n"
, i,
labels
.
vector
[real_i]);
107
}
108
}
109
110
if
(!found_plus_one)
111
SG_ERROR
(
"Not a two class labeling - no positively labeled examples found\n"
);
112
if
(!found_minus_one)
113
SG_ERROR
(
"Not a two class labeling - no negatively labeled examples found\n"
);
114
115
return
true
;
116
}
117
118
int32_t
CLabels::get_num_classes
()
119
{
120
CSet<float64_t>
* classes=
new
CSet<float64_t>
();
121
for
(int32_t i=0; i<
get_num_labels
(); i++)
122
classes->
add
(
get_label
(i));
123
124
int32_t result=classes->
get_num_elements
();
125
SG_UNREF
(classes);
126
return
result;
127
}
128
129
SGVector<float64_t>
CLabels::get_classes
()
130
{
131
CSet<float64_t>
* classes=
new
CSet<float64_t>
();
132
133
for
(int32_t i=0; i<
get_num_labels
(); i++)
134
classes->
add
(
get_label
(i));
135
136
SGVector<float64_t>
result(classes->
get_num_elements
());
137
memcpy(result.vector, classes->
get_array
(),
138
sizeof
(
float64_t
)*classes->
get_num_elements
());
139
140
SG_UNREF
(classes);
141
return
result;
142
}
143
144
SGVector<float64_t>
CLabels::get_labels
()
145
{
146
if
(m_subset)
147
SG_ERROR
(
"get_labels() is not possible on subset"
);
148
149
return
labels
;
150
}
151
152
SGVector<int32_t>
CLabels::get_int_labels
()
153
{
154
SGVector<int32_t>
intlab(
get_num_labels
(),
true
);
155
156
for
(int32_t i=0; i<
get_num_labels
(); i++)
157
intlab.
vector
[i]=
get_int_label
(i);
158
159
return
intlab;
160
}
161
162
void
CLabels::set_int_labels
(
SGVector<int32_t>
lab)
163
{
164
if
(m_subset)
165
SG_ERROR
(
"set_int_labels() is not possible on subset"
);
166
167
labels
.
free_vector
();
168
labels
=
SGVector<float64_t>
(lab.
vlen
);
169
170
for
(int32_t i=0; i<lab.
vlen
; i++)
171
set_int_label
(i,
labels
.
vector
[i]);
172
}
173
174
void
CLabels::load
(
CFile
* loader)
175
{
176
remove_subset
();
177
178
SG_SET_LOCALE_C
;
179
labels
.
free_vector
();
180
181
ASSERT
(loader);
182
loader->
get_vector
(
labels
.
vector
,
labels
.
vlen
);
183
m_num_classes
=
get_num_classes
();
184
SG_RESET_LOCALE
;
185
}
186
187
void
CLabels::save
(
CFile
* writer)
188
{
189
if
(m_subset)
190
SG_ERROR
(
"save() is not possible on subset"
);
191
192
SG_SET_LOCALE_C
;
193
ASSERT
(writer);
194
ASSERT
(
labels
.
vector
&&
labels
.
vlen
>0);
195
writer->
set_vector
(
labels
.
vector
,
labels
.
vlen
);
196
SG_RESET_LOCALE
;
197
}
198
199
bool
CLabels::set_label
(int32_t idx,
float64_t
label)
200
{
201
int32_t real_num=
subset_idx_conversion
(idx);
202
if
(
labels
.
vector
&& real_num<
get_num_labels
())
203
{
204
labels
.
vector
[real_num]=label;
205
return
true
;
206
}
207
else
208
return
false
;
209
}
210
211
bool
CLabels::set_int_label
(int32_t idx, int32_t label)
212
{
213
int32_t real_num=
subset_idx_conversion
(idx);
214
if
(
labels
.
vector
&& real_num<
get_num_labels
())
215
{
216
labels
.
vector
[real_num]= (
float64_t
) label;
217
return
true
;
218
}
219
else
220
return
false
;
221
}
222
223
float64_t
CLabels::get_label
(int32_t idx)
224
{
225
int32_t real_num=
subset_idx_conversion
(idx);
226
ASSERT
(
labels
.
vector
&& idx<
get_num_labels
());
227
return
labels
.
vector
[real_num];
228
}
229
230
int32_t
CLabels::get_int_label
(int32_t idx)
231
{
232
int32_t real_num=
subset_idx_conversion
(idx);
233
ASSERT
(
labels
.
vector
&& idx<
get_num_labels
());
234
if
(
labels
.
vector
[real_num] !=
float64_t
((int32_t(
labels
.
vector
[real_num]))))
235
SG_ERROR
(
"label[%d]=%g is not an integer\n"
,
labels
.
vector
[real_num]);
236
237
return
int32_t(
labels
.
vector
[real_num]);
238
}
239
240
int32_t
CLabels::get_num_labels
()
241
{
242
return
m_subset ? m_subset->
get_size
() :
labels
.
vlen
;
243
}
244
245
void
CLabels::set_subset
(
CSubset
* subset)
246
{
247
SG_UNREF
(m_subset);
248
m_subset=subset;
249
SG_REF
(subset);
250
}
251
252
void
CLabels::remove_subset
()
253
{
254
set_subset
(NULL);
255
}
256
257
index_t
CLabels::subset_idx_conversion
(
index_t
idx)
const
258
{
259
return
m_subset ? m_subset->
subset_idx_conversion
(idx) : idx;
260
}
SHOGUN
Machine Learning Toolbox - Documentation