kmeans
k-means clustering in C++
Loading...
Searching...
No Matches
remove_unused_centers.hpp
Go to the documentation of this file.
1#ifndef KMEANS_REMOVE_UNUSED_CENTERS_HPP
2#define KMEANS_REMOVE_UNUSED_CENTERS_HPP
3
4#include <vector>
5#include <cstddef>
6#include <algorithm>
7
8#include "sanisizer/sanisizer.hpp"
9
10#include "utils.hpp"
11
17namespace kmeans {
18
48template<typename Index_, typename Cluster_, typename Float_>
50 const std::size_t num_dimensions,
51 const Index_ num_observations,
52 Cluster_* const clusters,
53 const Cluster_ num_centers,
54 Float_* const centers,
55 std::vector<Index_>& sizes
56) {
57 bool has_zero = false;
58 for (Cluster_ c = 0; c < num_centers; ++c) {
59 if (sizes[c] == 0) {
60 has_zero = true;
61 break;
62 }
63 }
64 if (!has_zero) {
65 return num_centers;
66 }
67
68 auto remapping = sanisizer::create<std::vector<Index_> >(num_centers);
69 Cluster_ remaining = 0;
70 for (Cluster_ c = 0; c < num_centers; ++c) {
71 if (sizes[c]) {
72 remapping[c] = remaining;
73 if (remaining != c) {
74 std::copy_n(
75 centers + sanisizer::product_unsafe<std::size_t>(c, num_dimensions),
76 num_dimensions,
77 centers + sanisizer::product_unsafe<std::size_t>(remaining, num_dimensions)
78 );
79 sizes[remaining] = sizes[c];
80 }
81 ++remaining;
82 }
83 }
84
85 for (Index_ o = 0; o < num_observations; ++o) {
86 clusters[o] = remapping[clusters[o]];
87 }
88
89 return remaining;
90}
91
119template<typename Index_, typename Cluster_, typename Float_>
121 const std::size_t num_dimensions,
122 const Index_ num_observations,
123 Cluster_* const clusters,
124 const Cluster_ num_centers,
125 Float_* const centers,
126 std::vector<Index_>& sizes,
127 Float_ fill
128) {
129 const auto remaining = remove_unused_centers(num_dimensions, num_observations, clusters, num_centers, centers, sizes);
130
131 std::fill(sizes.begin() + remaining, sizes.end(), 0);
132
133 std::fill(
134 centers + sanisizer::product_unsafe<std::size_t>(remaining, num_dimensions),
135 centers + sanisizer::product_unsafe<std::size_t>(num_centers, num_dimensions),
136 fill
137 );
138
139 return remaining;
140}
141
142}
143
144#endif
Perform k-means clustering.
Definition compute_wcss.hpp:16
Cluster_ remove_unused_centers(const std::size_t num_dimensions, const Index_ num_observations, Cluster_ *const clusters, const Cluster_ num_centers, Float_ *const centers, std::vector< Index_ > &sizes)
Definition remove_unused_centers.hpp:49