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
machine
KernelMulticlassMachine.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) 2012 Chiyuan Zhang
8
* Written (W) 2012 Heiko Strathmann
9
* Copyright (C) 2012 Chiyuan Zhang
10
*/
11
12
#include <
shogun/lib/Set.h
>
13
#include <
shogun/machine/KernelMulticlassMachine.h
>
14
15
using namespace
shogun;
16
17
void
CKernelMulticlassMachine::store_model_features
()
18
{
19
CKernel
*kernel=
m_kernel
;
20
if
(!kernel)
21
SG_ERROR
(
"%s::store_model_features(): kernel is needed to store SV "
22
"features.\n"
,
get_name
());
23
24
CFeatures
* lhs=kernel->
get_lhs
();
25
CFeatures
* rhs=kernel->
get_rhs
();
26
if
(!lhs)
27
{
28
SG_ERROR
(
"%s::store_model_features(): kernel lhs is needed to store "
29
"SV features.\n"
,
get_name
());
30
}
31
32
/* this map will be abused as a map */
33
CSet<index_t>
all_sv;
34
for
(
index_t
i=0; i<
m_machines
->
get_num_elements
(); ++i)
35
{
36
CKernelMachine
*machine=(
CKernelMachine
*)
get_machine
(i);
37
for
(
index_t
j=0; j<machine->
get_num_support_vectors
(); ++j)
38
all_sv.
add
(machine->
get_support_vector
(j));
39
40
SG_UNREF
(machine);
41
}
42
43
/* convert map to vector of SV */
44
SGVector<index_t>
sv_idx(all_sv.
get_num_elements
());
45
for
(
index_t
i=0; i<sv_idx.vlen; ++i)
46
sv_idx[i]=*all_sv.
get_element_ptr
(i);
47
48
CFeatures
* sv_features=lhs->
copy_subset
(sv_idx);
49
50
/* now, features are replaced by concatenated SV features */
51
kernel->
init
(sv_features, rhs);
52
53
/* was SG_REF'ed by copy_subset */
54
SG_UNREF
(sv_features);
55
56
/* now the old SV indices have to be mapped to the new features */
57
58
/* update SV of all machines */
59
for
(int32_t i=0; i<
m_machines
->
get_num_elements
(); ++i)
60
{
61
CKernelMachine
*machine=(
CKernelMachine
*)
get_machine
(i);
62
63
/* for each machine, replace SV by index in sv_idx array */
64
for
(int32_t j=0; j<machine->
get_num_support_vectors
(); ++j)
65
{
66
/* get index of SV in old features */
67
index_t
current_sv_idx=machine->
get_support_vector
(j);
68
69
/* the position of this old index in the map is the position of
70
* the SV in the new features */
71
index_t
new_sv_idx=all_sv.
index_of
(current_sv_idx);
72
73
machine->
set_support_vector
(j, new_sv_idx);
74
}
75
76
SG_UNREF
(machine);
77
}
78
79
SG_UNREF
(lhs);
80
SG_UNREF
(rhs);
81
}
SHOGUN
Machine Learning Toolbox - Documentation