kmeans
k-means clustering in C++
Loading...
Searching...
No Matches
InitializeRandom.hpp
Go to the documentation of this file.
1#ifndef KMEANS_INITIALIZE_RANDOM_HPP
2#define KMEANS_INITIALIZE_RANDOM_HPP
3
4#include <algorithm>
5#include <cstdint>
6#include <random>
7
8#include "sanisizer/sanisizer.hpp"
9#include "aarand/aarand.hpp"
10
11#include "Initialize.hpp"
12#include "copy_into_array.hpp"
13
20namespace kmeans {
21
25typedef std::mt19937_64 InitializeRandomRng;
26
34 typename InitializeRandomRng::result_type seed = sanisizer::cap<InitializeRandomRng::result_type>(6523);
35};
36
48template<typename Index_, typename Data_, typename Cluster_, typename Float_, class Matrix_ = Matrix<Index_, Data_> >
49class InitializeRandom final : public Initialize<Index_, Data_, Cluster_, Float_, Matrix_> {
50private:
51 InitializeRandomOptions my_options;
52
53public:
57 InitializeRandom(InitializeRandomOptions options) : my_options(std::move(options)) {}
58
62 InitializeRandom() = default;
63
64public:
70 return my_options;
71 }
72
73public:
77 Cluster_ run(const Matrix_& data, const Cluster_ ncenters, Float_* const centers) const {
78 InitializeRandomRng eng(my_options.seed);
79 const auto nobs = data.num_observations();
80 const decltype(I(nobs)) nchosen = sanisizer::min(nobs, ncenters);
81 auto chosen = sanisizer::create<std::vector<Index_> >(nchosen);
82 aarand::sample(nobs, nchosen, chosen.begin(), eng);
83 internal::copy_into_array(data, chosen, centers);
84 return nchosen;
85 }
89};
90
91}
92
93#endif
Interface for k-means initialization.
Initialize by sampling random observations without replacement.
Definition InitializeRandom.hpp:49
InitializeRandom(InitializeRandomOptions options)
Definition InitializeRandom.hpp:57
InitializeRandomOptions & get_options()
Definition InitializeRandom.hpp:69
Interface for k-means initialization algorithms.
Definition Initialize.hpp:29
virtual Cluster_ run(const Matrix_ &data, Cluster_ num_centers, Float_ *centers) const =0
Perform k-means clustering.
Definition compute_wcss.hpp:16
std::mt19937_64 InitializeRandomRng
Definition InitializeRandom.hpp:25
Options for InitializeRandom.
Definition InitializeRandom.hpp:30
InitializeRandomRng::result_type seed
Definition InitializeRandom.hpp:34