-
-
Notifications
You must be signed in to change notification settings - Fork 1k
/
KernelLocallyLinearEmbedding.cpp
66 lines (55 loc) · 1.73 KB
/
KernelLocallyLinearEmbedding.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
/*
* This software is distributed under BSD 3-clause license (see LICENSE file).
*
* Authors: Sergey Lisitsyn, Soeren Sonnenburg, Heiko Strathmann,
* Fernando Iglesias, Viktor Gal, Evan Shelhamer
*/
#include <shogun/converter/KernelLocallyLinearEmbedding.h>
#include <shogun/io/SGIO.h>
#include <shogun/lib/tapkee/tapkee_shogun.hpp>
using namespace shogun;
CKernelLocallyLinearEmbedding::CKernelLocallyLinearEmbedding() :
CLocallyLinearEmbedding()
{
}
CKernelLocallyLinearEmbedding::CKernelLocallyLinearEmbedding(CKernel* kernel) :
CLocallyLinearEmbedding()
{
set_kernel(kernel);
}
const char* CKernelLocallyLinearEmbedding::get_name() const
{
return "KernelLocallyLinearEmbedding";
};
CKernelLocallyLinearEmbedding::~CKernelLocallyLinearEmbedding()
{
}
CFeatures*
CKernelLocallyLinearEmbedding::apply(CFeatures* features, bool inplace)
{
ASSERT(features)
SG_REF(features);
// get dimensionality and number of vectors of data
int32_t N = features->get_num_vectors();
if (m_k>=N)
SG_ERROR("Number of neighbors (%d) should be less than number of objects (%d).\n",
m_k, N);
// compute kernel matrix
ASSERT(m_kernel)
m_kernel->init(features,features);
CDenseFeatures<float64_t>* embedding = embed_kernel(m_kernel);
m_kernel->cleanup();
SG_UNREF(features);
return (CFeatures*)embedding;
}
CDenseFeatures<float64_t>* CKernelLocallyLinearEmbedding::embed_kernel(CKernel* kernel)
{
TAPKEE_PARAMETERS_FOR_SHOGUN parameters;
parameters.n_neighbors = m_k;
parameters.eigenshift = m_nullspace_shift;
parameters.method = SHOGUN_KERNEL_LOCALLY_LINEAR_EMBEDDING;
parameters.target_dimension = m_target_dim;
parameters.kernel = kernel;
CDenseFeatures<float64_t>* embedding = tapkee_embed(parameters);
return embedding;
}