57 bool fit(
const Eigen::Ref<const Eigen::MatrixXd> &points,
size_t nClusters, std::default_random_engine &rng,
size_t max_iter = 1000);
73 Eigen::VectorXd
centroid(
size_t i)
const;
174 std::default_random_engine
rng_;
175 std::uniform_real_distribution<double>
distU_{0.0, 1.0};
192 unsigned int seed = 12345
272 double logNIWPosterior(
const Eigen::VectorXd& x,
const Cluster& c)
const;
278 double K =
static_cast<double>(
clusters_.size());
279 double N =
static_cast<double>(
nPoints_);
290 double weight1 = (a + K - 1.0) / (N * (b - std::log(eta)));
291 double pi_eta = weight1 / (weight1 + 1.0);
295 double updated_beta = b - std::log(eta);
330 std::default_random_engine
rng_;
341 void fit(
const Eigen::Ref<const Eigen::MatrixXd> &points) {
342 size_t nPoints = points.rows();
343 std::uniform_int_distribution<size_t> dist(0,
nClusters_ - 1);
344 labels_ = Eigen::VectorXs::Zero(nPoints);
345 for(
size_t i = 0; i < nPoints; i++) {
Implements an infinite Gaussian Mixture Model using a Dirichlet Process Mixture Model (DPMM) and Gibb...
Definition cluster.h:132
size_t nClusters() const
Gets the current number of active clusters.
Definition cluster.h:227
Eigen::MatrixXd xObs_
Observed data points matrix (N x D).
Definition cluster.h:159
std::vector< double > logp_workspace_
Temporary buffer for cluster log-probabilities.
Definition cluster.h:155
Eigen::VectorXs getLabels() const
Gets the current cluster label assignments vector.
Definition cluster.h:218
std::map< size_t, Cluster > clusters_
Map from cluster ID to sufficient statistics cluster structure.
Definition cluster.h:170
std::vector< size_t > clusterIDs_
List of active cluster IDs.
Definition cluster.h:163
double getAlpha() const
Gets the current concentration parameter alpha.
Definition cluster.h:236
Eigen::VectorXs labels_
Current cluster assignment label vector.
Definition cluster.h:160
void condition(const Eigen::Ref< const Eigen::MatrixXd > &data, const Eigen::VectorXs &init_labels)
Conditions the DPMM model on the given dataset with initial cluster labels.
Definition cluster.cpp:195
void removePointFromCluster(const size_t &pointIndex, const size_t &clusterID)
Removes a point from the sufficient statistics of a specified cluster.
Definition cluster.cpp:120
void addPointToCluster(const size_t &pointIndex, const size_t &clusterID)
Adds a point to the sufficient statistics of a specified cluster.
Definition cluster.cpp:140
cmp::distribution::NormalInverseWishartDistribution hyper_
Hyperprior distribution parameters for clusters.
Definition cluster.h:166
cmp::distribution::GammaDistribution alphaPrior_
Prior distribution parameters for concentration parameter.
Definition cluster.h:167
size_t nextClusterId_
Counter to generate unique new cluster IDs.
Definition cluster.h:171
double alpha_
Concentration parameter alpha for the Dirichlet Process.
Definition cluster.h:168
void updateAlpha()
Updates the concentration parameter alpha via auxiliary variable sampling.
Definition cluster.h:277
std::default_random_engine rng_
Pseudo-random number generator engine.
Definition cluster.h:174
size_t nPoints_
Number of observation points.
Definition cluster.h:161
void remapLabels()
Remaps cluster labels to be contiguous integers starting from 0.
Definition cluster.cpp:285
int dim_
Dimensionality of the feature space.
Definition cluster.h:162
double logNIWPosterior(const Eigen::VectorXd &x, const Cluster &c) const
Computes the log posterior probability of a point under a cluster's NIW predictive distribution.
Definition cluster.cpp:159
std::uniform_real_distribution< double > distU_
Uniform real generator for rejection sampler.
Definition cluster.h:175
std::vector< size_t > clusterIDs_workspace_
Temporary buffer for cluster IDs.
Definition cluster.h:157
void step()
Performs one complete sweep of collapsed Gibbs sampling over all points.
Definition cluster.cpp:215
void init(const Eigen::VectorXs &init_labels)
Initializes cluster counts, sums, and sufficient statistics.
Definition cluster.cpp:100
std::vector< double > probs_workspace_
Temporary buffer for cluster probability weights.
Definition cluster.h:156
Simple partitioning algorithm that assigns observations to clusters uniformly at random.
Definition cluster.h:327
Eigen::VectorXs labels_
Vector of randomly assigned labels.
Definition cluster.h:331
size_t nClusters_
Number of target clusters.
Definition cluster.h:329
std::default_random_engine rng_
Random number generator.
Definition cluster.h:330
void fit(const Eigen::Ref< const Eigen::MatrixXd > &points)
Randomly assigns each data point to a cluster uniformly at random.
Definition cluster.h:341
DummyCluster(size_t nClusters, unsigned int seed=42)
Definition cluster.h:333
const Eigen::VectorXs & getLabels() const
Gets the randomly generated cluster labels.
Definition cluster.h:355
Implements a standard k-means clustering algorithm.
Definition cluster.h:36
const size_t & operator[](size_t i) const
Accesses the cluster label of the i-th point.
Definition cluster.cpp:72
size_t dim() const
Returns the dimension of the data.
Definition cluster.cpp:88
const Eigen::VectorXs & getLabels() const
Returns the cluster assignments vector.
Definition cluster.h:94
Eigen::VectorXd centroid(size_t i) const
Returns the centroid of the i-th cluster.
Definition cluster.cpp:76
size_t nPoints() const
Returns the number of data points.
Definition cluster.cpp:84
size_t nClusters() const
Returns the number of clusters.
Definition cluster.cpp:80
size_t nClusters_
Number of clusters.
Definition cluster.h:41
bool fit(const Eigen::Ref< const Eigen::MatrixXd > &points, size_t nClusters, std::default_random_engine &rng, size_t max_iter=1000)
Fits the K-means clustering model on the given dataset.
Definition cluster.cpp:3
Eigen::MatrixXd centroids_
Centroid coordinates for each cluster.
Definition cluster.h:39
Eigen::VectorXs labels_
Cluster label assigned to each data point.
Definition cluster.h:38
size_t nPoints_
Number of data points.
Definition cluster.h:42
GeometricCluster()=default
size_t dim_
Dimensionality of data features.
Definition cluster.h:43
Definition distribution.h:403
double sample(std::default_random_engine &rng)
Definition distribution.h:450
Definition distribution.h:337
double getBeta() const
Definition distribution.h:398
double sample(std::default_random_engine &rng)
Definition distribution.h:379
double getAlpha() const
Definition distribution.h:395
Definition distribution.h:973
Definition cmp_defines.h:19
Matrix< size_t, Eigen::Dynamic, 1 > VectorXs
Definition cmp_defines.h:20
Eigen::VectorXd sumOfX_
Sum of all points in the cluster.
Definition cluster.h:140
Cluster(size_t id, size_t dim)
Definition cluster.h:147
size_t id_
Unique cluster ID (not necessarily contiguous).
Definition cluster.h:136
Eigen::MatrixXd sumOfXXT_
Sum of all outer products x * x^T for points in the cluster.
Definition cluster.h:141
Cluster()
Definition cluster.h:144
size_t nPoints_
Number of points assigned to this cluster.
Definition cluster.h:137