SHOGUN  v3.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups 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 #ifdef HAVE_EIGEN3
17 #ifdef HAVE_LAPACK
18 
19 #include <shogun/lib/common.h>
20 #include <shogun/lib/SGMatrix.h>
24 #include <Eigen/Dense>
25 
26 #include <set>
27 #include <vector>
28 
29 #ifndef DOXYGEN_SHOULD_SKIP_THIS
30 
31 namespace shogun
32 {
33 
34 struct CImpostorNode;
35 
36 typedef std::set<CImpostorNode> ImpostorsSetType;
37 
43 struct CImpostorNode
44 {
52  CImpostorNode(index_t ex, index_t tar, index_t imp);
53 
65  bool operator<(const CImpostorNode& rhs) const;
66 
68  index_t example;
69 
71  index_t target;
72 
74  index_t impostor;
75 };
76 
80 class CLMNNImpl
81 {
82  public:
83 
88  static void check_training_setup(CFeatures* features, const CLabels* labels, SGMatrix<float64_t>& init_transform);
89 
94  static SGMatrix<index_t> find_target_nn(CDenseFeatures<float64_t>* x, CMulticlassLabels* y, int32_t k);
95 
97  static Eigen::MatrixXd sum_outer_products(CDenseFeatures<float64_t>* x, const SGMatrix<index_t> target_nn);
98 
100  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);
101 
103  static void update_gradient(CDenseFeatures<float64_t>* x, Eigen::MatrixXd& G, const ImpostorsSetType& Nc, const ImpostorsSetType& Np, float64_t mu);
104 
106  static void gradient_step(Eigen::MatrixXd& L, const Eigen::MatrixXd& G, float64_t stepsize, bool diagonal);
107 
109  static void correct_stepsize(float64_t& stepsize, const SGVector<float64_t> obj, const uint32_t iter);
110 
116  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);
117 
118  private:
119 
121  static SGMatrix<float64_t> compute_pca_transform(CDenseFeatures<float64_t>* features);
122 
127  static Eigen::MatrixXd compute_sqdists(Eigen::MatrixXd& L, const SGMatrix<index_t> target_nn);
128 
133  static SGVector<float64_t> compute_impostors_sqdists(Eigen::MatrixXd& L, const ImpostorsSetType& Nexact);
134 
136  static ImpostorsSetType find_impostors_exact(Eigen::MatrixXd& LX, const Eigen::MatrixXd& sqdists, CMulticlassLabels* y, const SGMatrix<index_t> target_nn, int32_t k);
137 
139  static ImpostorsSetType find_impostors_approx(Eigen::MatrixXd& LX, const Eigen::MatrixXd& sqdists, const ImpostorsSetType& Nexact, const SGMatrix<index_t> target_nn);
140 
142  static std::vector<index_t> get_examples_label(CMulticlassLabels* y, float64_t yi);
143 
145  static std::vector<index_t> get_examples_gtlabel(CMulticlassLabels* y, float64_t yi);
146 
152  static CEuclideanDistance* setup_distance(CDenseFeatures<float64_t>* x, std::vector<index_t>& a, std::vector<index_t>& b);
153 
154 
155 }; /* class CLMNNImpl */
156 
157 } /* namespace shogun */
158 
159 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
160 
161 #endif /* HAVE_LAPACK */
162 #endif /* HAVE_EIGEN3 */
163 
164 #endif /* _LMNNIMPL_H_ */

SHOGUN Machine Learning Toolbox - Documentation