-
-
Notifications
You must be signed in to change notification settings - Fork 1k
/
DimensionReductionPreprocessor.cpp
113 lines (96 loc) · 2.81 KB
/
DimensionReductionPreprocessor.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <shogun/preprocessor/DimensionReductionPreprocessor.h>
#include <shogun/converter/EmbeddingConverter.h>
#include <shogun/kernel/LinearKernel.h>
#include <shogun/distance/EuclideanDistance.h>
using namespace shogun;
namespace shogun
{
CDimensionReductionPreprocessor::CDimensionReductionPreprocessor()
: CDensePreprocessor<float64_t>()
{
m_target_dim = 1;
m_distance = new CEuclideanDistance();
m_kernel = new CLinearKernel();
m_converter = NULL;
initialize_parameters();
}
CDimensionReductionPreprocessor::CDimensionReductionPreprocessor(CEmbeddingConverter* converter)
: CDensePreprocessor<float64_t>()
{
SG_REF(converter);
m_target_dim = 1;
m_distance = new CEuclideanDistance();
m_kernel = new CLinearKernel();
m_converter = converter;
initialize_parameters();
}
CDimensionReductionPreprocessor::~CDimensionReductionPreprocessor()
{
SG_UNREF(m_distance);
SG_UNREF(m_kernel);
SG_UNREF(m_converter);
}
SGMatrix<float64_t> CDimensionReductionPreprocessor::apply_to_feature_matrix(CFeatures* features)
{
if (m_converter)
{
m_converter->set_target_dim(m_target_dim);
CDenseFeatures<float64_t>* embedding = m_converter->embed(features);
SGMatrix<float64_t> embedding_feature_matrix = embedding->steal_feature_matrix();
((CDenseFeatures<float64_t>*)features)->set_feature_matrix(embedding_feature_matrix);
delete embedding;
return embedding_feature_matrix;
}
else
{
SG_WARNING("Converter to process was not set.\n")
return features->as<CDenseFeatures<float64_t>>()->get_feature_matrix();
}
}
void CDimensionReductionPreprocessor::cleanup()
{
}
EPreprocessorType CDimensionReductionPreprocessor::get_type() const { return P_DIMENSIONREDUCTIONPREPROCESSOR; };
void CDimensionReductionPreprocessor::set_target_dim(int32_t dim)
{
ASSERT(dim>0)
m_target_dim = dim;
}
int32_t CDimensionReductionPreprocessor::get_target_dim() const
{
return m_target_dim;
}
void CDimensionReductionPreprocessor::set_distance(CDistance* distance)
{
SG_REF(distance);
SG_UNREF(m_distance);
m_distance = distance;
}
CDistance* CDimensionReductionPreprocessor::get_distance() const
{
SG_REF(m_distance);
return m_distance;
}
void CDimensionReductionPreprocessor::set_kernel(CKernel* kernel)
{
SG_REF(kernel);
SG_UNREF(m_kernel);
m_kernel = kernel;
}
CKernel* CDimensionReductionPreprocessor::get_kernel() const
{
SG_REF(m_kernel);
return m_kernel;
}
void CDimensionReductionPreprocessor::initialize_parameters()
{
SG_ADD((CSGObject**)&m_converter, "converter",
"embedding converter used to apply to data", MS_AVAILABLE);
SG_ADD(&m_target_dim, "target_dim",
"target dimensionality of preprocessor", MS_AVAILABLE);
SG_ADD((CSGObject**)&m_distance, "distance",
"distance to be used for embedding", MS_AVAILABLE);
SG_ADD((CSGObject**)&m_kernel, "kernel",
"kernel to be used for embedding", MS_AVAILABLE);
}
}