SHOGUN
v3.2.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 2013 Vladyslav S. Gorbatiuk 00008 * Copyright (C) 2011-2013 Vladyslav S. Gorbatiuk 00009 */ 00010 00011 #include <shogun/converter/ManifoldSculpting.h> 00012 #ifdef HAVE_EIGEN3 00013 #include <shogun/lib/tapkee/tapkee_shogun.hpp> 00014 #include <shogun/features/DenseFeatures.h> 00015 #include <shogun/distance/EuclideanDistance.h> 00016 00017 using namespace shogun; 00018 00019 CManifoldSculpting::CManifoldSculpting() : 00020 CEmbeddingConverter() 00021 { 00022 // Default values 00023 m_k = 10; 00024 m_squishing_rate = 0.8; 00025 m_max_iteration = 80; 00026 init(); 00027 } 00028 00029 void CManifoldSculpting::init() 00030 { 00031 SG_ADD(&m_k, "k", "number of neighbors", MS_NOT_AVAILABLE); 00032 SG_ADD(&m_squishing_rate, "quishing_rate", 00033 "squishing rate",MS_NOT_AVAILABLE); 00034 SG_ADD(&m_max_iteration, "max_iteration", 00035 "maximum number of algorithm's iterations", MS_NOT_AVAILABLE); 00036 } 00037 00038 CManifoldSculpting::~CManifoldSculpting() 00039 { 00040 } 00041 00042 const char* CManifoldSculpting::get_name() const 00043 { 00044 return "ManifoldSculpting"; 00045 } 00046 00047 void CManifoldSculpting::set_k(const int32_t k) 00048 { 00049 ASSERT(k>0) 00050 m_k = k; 00051 } 00052 00053 int32_t CManifoldSculpting::get_k() const 00054 { 00055 return m_k; 00056 } 00057 00058 void CManifoldSculpting::set_squishing_rate(const float64_t squishing_rate) 00059 { 00060 ASSERT(squishing_rate >= 0 && squishing_rate < 1) 00061 m_squishing_rate = squishing_rate; 00062 } 00063 00064 float64_t CManifoldSculpting::get_squishing_rate() const 00065 { 00066 return m_squishing_rate; 00067 } 00068 00069 void CManifoldSculpting::set_max_iteration(const int32_t max_iteration) 00070 { 00071 ASSERT(max_iteration > 0) 00072 m_max_iteration = max_iteration; 00073 } 00074 00075 int32_t CManifoldSculpting::get_max_iteration() const 00076 { 00077 return m_max_iteration; 00078 } 00079 00080 CFeatures* CManifoldSculpting::apply(CFeatures* features) 00081 { 00082 CDenseFeatures<float64_t>* feats = (CDenseFeatures<float64_t>*)features; 00083 SG_REF(feats); 00084 CDistance* euclidean_distance = 00085 new CEuclideanDistance(feats, feats); 00086 00087 TAPKEE_PARAMETERS_FOR_SHOGUN parameters; 00088 parameters.n_neighbors = m_k; 00089 parameters.squishing_rate = m_squishing_rate; 00090 parameters.max_iteration = m_max_iteration; 00091 parameters.features = feats; 00092 parameters.distance = euclidean_distance; 00093 00094 parameters.method = SHOGUN_MANIFOLD_SCULPTING; 00095 parameters.target_dimension = m_target_dim; 00096 CDenseFeatures<float64_t>* embedding = tapkee_embed(parameters); 00097 00098 SG_UNREF(euclidean_distance); 00099 00100 return embedding; 00101 } 00102 00103 #endif /* HAVE_EIGEN */