qdtsne
Quick and dirty t-SNE in C++
Loading...
Searching...
No Matches
initialize.hpp
Go to the documentation of this file.
1#ifndef QDTSNE_INITIALIZE_HPP
2#define QDTSNE_INITIALIZE_HPP
3
4#include <cstddef>
5
7
8#include "Status.hpp"
9#include "Options.hpp"
10#include "gaussian.hpp"
11#include "symmetrize.hpp"
12
18namespace qdtsne {
19
23namespace internal {
24
25template<std::size_t num_dim_, typename Index_, typename Float_>
26Status<num_dim_, Index_, Float_> initialize(NeighborList<Index_, Float_> nn, const Float_ perp, const Options& options) {
27 compute_gaussian_perplexity(nn, perp, options.num_threads);
28 symmetrize_matrix(nn);
29 return Status<num_dim_, Index_, Float_>(std::move(nn), options);
30}
31
32}
54template<std::size_t num_dim_, typename Index_, typename Float_>
56 Float_ perp = options.perplexity;
57 if (neighbors.size()) {
58 if (options.precomputed_perplexity_policy == PrecomputedPerplexityPolicy::ASIS) {
59 ;
60 } else {
61 if (options.precomputed_perplexity_policy == PrecomputedPerplexityPolicy::INFER) {
62 perp = static_cast<Float_>(neighbors.front().size())/3;
63 } else {
64 if (!sanisizer::is_equal(neighbors.front().size(), perplexity_to_k(options.perplexity))) {
65 throw std::runtime_error("unexpected number of neighbors for the specified perplexity");
66 }
67 }
68 }
69 }
70 return internal::initialize<num_dim_>(std::move(neighbors), perp, options);
71}
72
89template<std::size_t num_dim_, typename Index_, typename Input_, typename Float_>
91 const Index_ K = perplexity_to_k<Index_>(options.perplexity);
92 auto neighbors = knncolle::find_nearest_neighbors(prebuilt, K, options.num_threads);
93 return internal::initialize<num_dim_>(std::move(neighbors), static_cast<Float_>(options.perplexity), options);
94}
95
115template<std::size_t num_dim_, typename Index_, typename Float_, class Matrix_>
117 const std::size_t data_dim,
118 const Index_ num_obs,
119 const Float_* const data,
121 const Options& options)
122{
123 auto index = builder.build_unique(knncolle::SimpleMatrix<Index_, Float_>(data_dim, num_obs, data));
124 return initialize<num_dim_>(*index, options);
125}
126
127}
128
129#endif
Options for the t-SNE algorithm.
Status of the t-SNE iterations.
std::unique_ptr< Prebuilt< Index_, Data_, Distance_ > > build_unique(const Matrix_ &data) const
Status of the t-SNE iterations.
Definition Status.hpp:65
NeighborList< Index_, Distance_ > find_nearest_neighbors(const Prebuilt< Index_, Data_, Distance_ > &index, int k, int num_threads=1)
Quick and dirty t-SNE.
knncolle::NeighborList< Index_, Float_ > NeighborList
Lists of neighbors for each observation.
Definition utils.hpp:37
Index_ perplexity_to_k(const double perplexity)
Definition utils.hpp:48
Status< num_dim_, Index_, Float_ > initialize(NeighborList< Index_, Float_ > neighbors, const Options &options)
Definition initialize.hpp:55
Options for initialize().
Definition Options.hpp:27
PrecomputedPerplexityPolicy precomputed_perplexity_policy
Definition Options.hpp:43
int num_threads
Definition Options.hpp:134
double perplexity
Definition Options.hpp:37