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
34template<class Matrix_, typename Cluster_, typename Float_>
35void compute_wcss(const Matrix_& data, const Cluster_ num_centers, const Float_* const centers, const Cluster_* const clusters, Float_* const wcss) {
36 const auto nobs = data.num_observations();
37 const auto ndim = data.num_dimensions();
38 std::fill_n(wcss, num_centers, 0);
39
40 auto work = data.new_extractor(static_cast<I<decltype(nobs)> >(0), nobs);
41 for (I<decltype(nobs)> obs = 0; obs < nobs; ++obs) {
42 const auto curdata = work->get_observation();
43 const auto cen = clusters[obs];
44
45 Float_& curwcss = wcss[cen];
46 for (I<decltype(ndim)> d = 0; d < ndim; ++d) {
47 const auto curcenter = centers[sanisizer::nd_offset<std::size_t>(d, ndim, cen)];
48 const Float_ delta = static_cast<Float_>(curdata[d]) - curcenter; // cast for consistent precision regardless of the input data type.
49 curwcss += delta * delta;
50 }
51 }
52}
53
54}
55
56#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:35