43 #include <boost/numeric/ublas/matrix.hpp>
50 template <
typename _T>
57 using Matrix = boost::numeric::ublas::matrix<double>;
83 void kcenters(
const std::vector<_T>& data,
unsigned int k, std::vector<unsigned int>& centers,
Matrix& dists)
87 std::vector<double> min_dist(data.size(), std::numeric_limits<double>::infinity());
91 if (dists.size1() < data.size() || dists.size2() < k)
92 dists.resize(std::max(2 * dists.size1() + 1, data.size()), k,
false);
94 centers.push_back(std::uniform_int_distribution<size_t>{ 0, data.size() - 1 }(
generator_));
95 for (
unsigned i = 1; i < k; ++i)
98 const _T& center = data[centers[i - 1]];
99 double max_dist = -std::numeric_limits<double>::infinity();
100 for (
unsigned j = 0; j < data.size(); ++j)
102 if ((dists(j, i - 1) =
distFun_(data[j], center)) < min_dist[j])
103 min_dist[j] = dists(j, i - 1);
105 if (min_dist[j] > max_dist)
108 max_dist = min_dist[j];
112 if (max_dist < std::numeric_limits<double>::epsilon())
114 centers.push_back(ind);
117 const _T& center = data[centers.back()];
118 unsigned i = centers.size() - 1;
119 for (
unsigned j = 0; j < data.size(); ++j)
120 dists(j, i) =
distFun_(data[j], center);