kmeans
k-means clustering in C++
Loading...
Searching...
No Matches
compute_wcss.hpp
Go to the documentation of this file.
1#ifndef KMEANS_COMPUTE_WCSS_HPP
2#define KMEANS_COMPUTE_WCSS_HPP
3
4#include <algorithm>
5#include <cstddef>
6
7#include "sanisizer/sanisizer.hpp"
8
9#include "utils.hpp"
10
16namespace kmeans {
17
33template<class Matrix_, typename Cluster_, typename Float_>
34void compute_wcss(const Matrix_& data, const Cluster_ num_centers, const Float_* const centers, const Cluster_* const clusters, Float_* const wcss) {
35 const auto nobs = data.num_observations();
36 const auto ndim = data.num_dimensions();
37 std::fill_n(wcss, num_centers, 0);
38
39 auto work = data.new_extractor(static_cast<decltype(I(nobs))>(0), nobs);
40 for (decltype(I(nobs)) obs = 0; obs < nobs; ++obs) {
41 const auto curdata = work->get_observation();
42 const auto cen = clusters[obs];
43
44 Float_& curwcss = wcss[cen];
45 for (decltype(I(ndim)) d = 0; d < ndim; ++d) {
46 const auto curcenter = centers[sanisizer::nd_offset<std::size_t>(d, ndim, cen)];
47 const Float_ delta = static_cast<Float_>(curdata[d]) - curcenter; // cast for consistent precision regardless of the input data type.
48 curwcss += delta * delta;
49 }
50 }
51}
52
53}
54
55#endif
Perform k-means clustering.
Definition compute_wcss.hpp:16
void compute_wcss(const Matrix_ &data, const Cluster_ num_centers, const Float_ *const centers, const Cluster_ *const clusters, Float_ *const wcss)
Definition compute_wcss.hpp:34