16 #ifndef MLPACK_METHODS_KMEANS_NAIVE_KMEANS_IMPL_HPP 17 #define MLPACK_METHODS_KMEANS_NAIVE_KMEANS_IMPL_HPP 25 template<
typename MetricType,
typename MatType>
30 distanceCalculations(0)
34 template<
typename MetricType,
typename MatType>
36 arma::mat& newCentroids,
37 arma::Col<size_t>& counts)
39 newCentroids.zeros(centroids.n_rows, centroids.n_cols);
40 counts.zeros(centroids.n_cols);
47 arma::mat localCentroids(centroids.n_rows, centroids.n_cols,
49 arma::Col<size_t> localCounts(centroids.n_cols, arma::fill::zeros);
52 for (omp_size_t i = 0; i < (omp_size_t) dataset.n_cols; ++i)
55 double minDistance = std::numeric_limits<double>::infinity();
56 size_t closestCluster = centroids.n_cols;
58 for (
size_t j = 0; j < centroids.n_cols; ++j)
60 const double distance = metric.Evaluate(dataset.col(i),
61 centroids.unsafe_col(j));
62 if (distance < minDistance)
64 minDistance = distance;
72 localCentroids.unsafe_col(closestCluster) += dataset.col(i);
73 localCounts(closestCluster)++;
78 newCentroids += localCentroids;
79 counts += localCounts;
84 for (
size_t i = 0; i < centroids.n_cols; ++i)
86 newCentroids.col(i) /= counts(i);
88 distanceCalculations += centroids.n_cols * dataset.n_cols;
92 for (
size_t i = 0; i < centroids.n_cols; ++i)
94 cNorm += std::pow(metric.Evaluate(centroids.col(i), newCentroids.col(i)),
97 distanceCalculations += centroids.n_cols;
99 return std::sqrt(cNorm);
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
NaiveKMeans(const MatType &dataset, MetricType &metric)
Construct the NaiveKMeans object with the given dataset and metric.
Definition: naive_kmeans_impl.hpp:26
double Iterate(const arma::mat ¢roids, arma::mat &newCentroids, arma::Col< size_t > &counts)
Run a single iteration of the Lloyd algorithm, updating the given centroids into the newCentroids mat...
Definition: naive_kmeans_impl.hpp:35
static void Assert(bool condition, const std::string &message="Assert Failed.")
Checks if the specified condition is true.
Definition: log.cpp:38