SHOGUN  4.2.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
LMNNImpl.h
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) 2013 Fernando J. Iglesias Garcia
8  * Copyright (C) 2013 Fernando J. Iglesias Garcia
9  */
10 
11 #ifndef LMNNIMPL_H_
12 #define LMNNIMPL_H_
13 
14 #include <shogun/lib/config.h>
15 
16 
17 #include <shogun/lib/common.h>
18 #include <shogun/lib/SGMatrix.h>
22 #include <Eigen/Dense>
23 
24 #include <set>
25 #include <vector>
26 
27 #ifndef DOXYGEN_SHOULD_SKIP_THIS
28 
29 namespace shogun
30 {
31 
32 struct CImpostorNode;
33 
34 typedef std::set<CImpostorNode> ImpostorsSetType;
35 
41 struct CImpostorNode
42 {
50  CImpostorNode(index_t ex, index_t tar, index_t imp);
51 
63  bool operator<(const CImpostorNode& rhs) const;
64 
66  index_t example;
67 
69  index_t target;
70 
72  index_t impostor;
73 };
74 
78 class CLMNNImpl
79 {
80  public:
81 
86  static void check_training_setup(CFeatures* features, const CLabels* labels, SGMatrix<float64_t>& init_transform);
87 
92  static SGMatrix<index_t> find_target_nn(CDenseFeatures<float64_t>* x, CMulticlassLabels* y, int32_t k);
93 
95  static Eigen::MatrixXd sum_outer_products(CDenseFeatures<float64_t>* x, const SGMatrix<index_t> target_nn);
96 
98  static ImpostorsSetType find_impostors(CDenseFeatures<float64_t>* x, CMulticlassLabels* y, const Eigen::MatrixXd& L, const SGMatrix<index_t> target_nn, const uint32_t iter, const uint32_t correction);
99 
101  static void update_gradient(CDenseFeatures<float64_t>* x, Eigen::MatrixXd& G, const ImpostorsSetType& Nc, const ImpostorsSetType& Np, float64_t mu);
102 
104  static void gradient_step(Eigen::MatrixXd& L, const Eigen::MatrixXd& G, float64_t stepsize, bool diagonal);
105 
107  static void correct_stepsize(float64_t& stepsize, const SGVector<float64_t> obj, const uint32_t iter);
108 
114  static bool check_termination(float64_t stepsize, const SGVector<float64_t> obj, uint32_t iter, uint32_t maxiter, float64_t stepsize_threshold, float64_t obj_threshold);
115 
116  private:
117 
119  static SGMatrix<float64_t> compute_pca_transform(CDenseFeatures<float64_t>* features);
120 
125  static Eigen::MatrixXd compute_sqdists(Eigen::MatrixXd& L, const SGMatrix<index_t> target_nn);
126 
131  static SGVector<float64_t> compute_impostors_sqdists(Eigen::MatrixXd& L, const ImpostorsSetType& Nexact);
132 
134  static ImpostorsSetType find_impostors_exact(Eigen::MatrixXd& LX, const Eigen::MatrixXd& sqdists, CMulticlassLabels* y, const SGMatrix<index_t> target_nn, int32_t k);
135 
137  static ImpostorsSetType find_impostors_approx(Eigen::MatrixXd& LX, const Eigen::MatrixXd& sqdists, const ImpostorsSetType& Nexact, const SGMatrix<index_t> target_nn);
138 
140  static std::vector<index_t> get_examples_label(CMulticlassLabels* y, float64_t yi);
141 
143  static std::vector<index_t> get_examples_gtlabel(CMulticlassLabels* y, float64_t yi);
144 
150  static CEuclideanDistance* setup_distance(CDenseFeatures<float64_t>* x, std::vector<index_t>& a, std::vector<index_t>& b);
151 
152 
153 }; /* class CLMNNImpl */
154 
155 } /* namespace shogun */
156 
157 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
158 
159 
160 #endif /* _LMNNIMPL_H_ */
bool operator<(const BaseTag &first, const BaseTag &second)
Definition: basetag.h:125
int32_t index_t
Definition: common.h:62
double float64_t
Definition: common.h:50
all of classes and functions are contained in the shogun namespace
Definition: class_list.h:18

SHOGUN Machine Learning Toolbox - Documentation