22 #ifndef CRNKMEANS_HEADER
23 #define CRNKMEANS_HEADER
47 typename std::enable_if<IsMetric<typename std::result_of<decltype(Dereference<T>)&(
const T&)>::type>::value,
int>::type = 0,
48 typename std::enable_if<IsVectorOverR<typename std::result_of<decltype(Dereference<T>)&(
const T&)>::type>::value,
int>::type = 0
52 using value_type =
typename std::result_of<decltype(Dereference<T>)&(
const T&)>::type;
71 auto generator = std::default_random_engine{};
72 auto distribution = std::uniform_int_distribution<size_t>{0, nb - 1};
78 const std::vector<value_type>&
GetPrototypes() const noexcept {
return proto; }
94 data.push_back(std::move(sam));
99 const std::vector<const T>&
GetSamples() const noexcept {
return data; }
107 size_t Run(
size_t maxcnt = 100)
109 auto cnt = size_t(0);
110 const auto k = proto.size();
113 auto popclasses = std::vector<size_t>(k, 0);
114 auto finished =
false;
117 for (
auto &c : classes)
120 for (
auto elnum =
size_t(0); elnum < data.size(); ++elnum)
123 classes[
Classify(*data[elnum])].push_back(elnum);
127 for (
auto p =
size_t(0); p < k; p++)
131 for (
const auto &num : classes[p])
133 proto[p] =
value_type(sum * (1.0 /
double(classes[p].size())));
135 if (popclasses[p] != classes[p].size())
137 popclasses[p] = classes[p].size();
168 const std::vector<size_t>&
GetClass(
size_t k)
const
170 if (k >= classes.size())
176 std::vector<const T> data;
177 std::vector<value_type> proto;
178 std::vector<std::vector<size_t>> classes;
typename TypeInfo< T >::SumType SumType
kMeans & operator=(const kMeans &)=delete
k-means clustering algorithm
size_t Run(size_t maxcnt=100)
Runs the k-means.
size_t GetNbClasses() const noexcept
Returns the number of classes.
void AddSample(T &&sam)
Adds one sample.
void AddSample(const T &sam)
Adds one sample.
void AddRandomPrototype()
Adds one random prototype out of the samples pool.
const std::vector< value_type > & GetPrototypes() const noexcept
Returns the vector of prototypes.
T Zero(const T &)
Returns an object of the same type that represents 0.
void ClearPrototypes() noexcept
Clears the prototypes.
size_t Classify(const value_type &obj, double *distance=nullptr)
Finds the closest prototype.
const std::vector< size_t > & GetClass(size_t k) const
Returns the content of one class.
size_t GetNbSamples() const noexcept
Returns the number of samples.
kMeans(const kMeans &)=delete
static ClassifResult NearestNeighbor(const typename std::iterator_traits< ConstIterator >::value_type &obj, ConstIterator begin, ConstIterator end)
Finds the nearest neighbor in a set of objects.
void ClearSamples() noexcept
Clears the samples.
std::pointer_traits< P >::element_type & Dereference(const P &p)
typename std::result_of< decltype(Dereference< T >)&(const T &)>::type value_type
void AddPrototype(const T &sam)
Adds one prototype.
const std::vector< const T > & GetSamples() const noexcept
Returns the vector of samples.
An item was not found in a container.