MLpp
Clustering.hpp
1 #pragma once
2 /* (C) 2020 Roman Werpachowski. */
3 #include <memory>
4 #include <random>
5 #include <vector>
6 #include <Eigen/Core>
7 #include "dll.hpp"
8 
9 namespace ml
10 {
12  namespace Clustering
13  {
17  class Model
18  {
19  public:
23  DLL_DECLSPEC virtual ~Model();
24 
30  virtual bool fit(Eigen::Ref<const Eigen::MatrixXd> data) = 0;
31 
36  virtual unsigned int number_clusters() const = 0;
37 
41  virtual const std::vector<unsigned int>& labels() const = 0;
42 
49  virtual const Eigen::MatrixXd& centroids() const = 0;
50 
54  virtual bool converged() const = 0;
55  };
56 
59  {
60  public:
62  DLL_DECLSPEC virtual ~CentroidsInitialiser();
63 
71  DLL_DECLSPEC virtual void init(Eigen::Ref<const Eigen::MatrixXd> data, std::default_random_engine& prng, unsigned int number_components, Eigen::Ref<Eigen::MatrixXd> centroids) const = 0;
72  };
73 
76  {
77  public:
79  DLL_DECLSPEC virtual ~ResponsibilitiesInitialiser();
80 
88  DLL_DECLSPEC virtual void init(Eigen::Ref<const Eigen::MatrixXd> data, std::default_random_engine& prng, unsigned int number_components, Eigen::Ref<Eigen::MatrixXd> responsibilities) const = 0;
89  };
90 
92  class Forgy : public CentroidsInitialiser
93  {
94  public:
95  DLL_DECLSPEC void init(Eigen::Ref<const Eigen::MatrixXd> data, std::default_random_engine& prng, unsigned int number_components, Eigen::Ref<Eigen::MatrixXd> centroids) const override;
96  };
97 
100  {
101  public:
102  DLL_DECLSPEC void init(Eigen::Ref<const Eigen::MatrixXd> data, std::default_random_engine& prng, unsigned int number_components, Eigen::Ref<Eigen::MatrixXd> centroids) const override;
103  };
104 
108  class KPP : public CentroidsInitialiser
109  {
110  public:
111  DLL_DECLSPEC void init(Eigen::Ref<const Eigen::MatrixXd> data, std::default_random_engine& prng, unsigned int number_components, Eigen::Ref<Eigen::MatrixXd> centroids) const override;
112  };
113 
116  {
117  public:
122  DLL_DECLSPEC ClosestCentroid(std::shared_ptr<const CentroidsInitialiser> centroids_initialiser);
123 
124  void init(Eigen::Ref<const Eigen::MatrixXd> data, std::default_random_engine& prng, unsigned int number_components, Eigen::Ref<Eigen::MatrixXd> responsibilities) const override;
125  private:
126  std::shared_ptr<const CentroidsInitialiser> centroids_initialiser_;
127  };
128  }
129 }
ml::Clustering::RandomPartition::init
void init(Eigen::Ref< const Eigen::MatrixXd > data, std::default_random_engine &prng, unsigned int number_components, Eigen::Ref< Eigen::MatrixXd > centroids) const override
Initialises location of centroids.
ml::Clustering::Model::labels
virtual const std::vector< unsigned int > & labels() const =0
Returns a const reference to resulting cluster labels for each datapoint. Value make sense only if fi...
ml::Clustering::Model::converged
virtual bool converged() const =0
Reports if the model converged.
ml::Clustering::ClosestCentroid::init
void init(Eigen::Ref< const Eigen::MatrixXd > data, std::default_random_engine &prng, unsigned int number_components, Eigen::Ref< Eigen::MatrixXd > responsibilities) const override
Initialises component responsibilities.
ml
Definition: BallTree.hpp:10
ml::Clustering::Model::fit
virtual bool fit(Eigen::Ref< const Eigen::MatrixXd > data)=0
Fits the model.
ml::Clustering::RandomPartition
Assigns points to clusters randomly and then returns cluster means.
Definition: Clustering.hpp:99
dll.hpp
ml::Clustering::Model::number_clusters
virtual unsigned int number_clusters() const =0
Returns the number of clusters.
ml::Clustering::ResponsibilitiesInitialiser
Chooses initial component responsibilities.
Definition: Clustering.hpp:75
ml::Clustering::Forgy
Chooses random points as new centroids.
Definition: Clustering.hpp:92
ml::Clustering::CentroidsInitialiser::~CentroidsInitialiser
virtual ~CentroidsInitialiser()
Virtual destructor.
ml::Clustering::Model
Abstract clustering model.
Definition: Clustering.hpp:17
ml::Clustering::ClosestCentroid::ClosestCentroid
ClosestCentroid(std::shared_ptr< const CentroidsInitialiser > centroids_initialiser)
Constructor.
ml::Clustering::Model::~Model
virtual ~Model()
Virtual destructor.
ml::Clustering::KPP::init
void init(Eigen::Ref< const Eigen::MatrixXd > data, std::default_random_engine &prng, unsigned int number_components, Eigen::Ref< Eigen::MatrixXd > centroids) const override
Initialises location of centroids.
ml::Clustering::CentroidsInitialiser::init
virtual void init(Eigen::Ref< const Eigen::MatrixXd > data, std::default_random_engine &prng, unsigned int number_components, Eigen::Ref< Eigen::MatrixXd > centroids) const =0
Initialises location of centroids.
ml::Clustering::ResponsibilitiesInitialiser::init
virtual void init(Eigen::Ref< const Eigen::MatrixXd > data, std::default_random_engine &prng, unsigned int number_components, Eigen::Ref< Eigen::MatrixXd > responsibilities) const =0
Initialises component responsibilities.
ml::Clustering::Model::centroids
virtual const Eigen::MatrixXd & centroids() const =0
Returns a const reference to the matrix of cluster centroids (in columns).
ml::Clustering::CentroidsInitialiser
Chooses initial locations of centroids.
Definition: Clustering.hpp:58
ml::Clustering::ResponsibilitiesInitialiser::~ResponsibilitiesInitialiser
virtual ~ResponsibilitiesInitialiser()
Virtual destructor.
ml::Clustering::Forgy::init
void init(Eigen::Ref< const Eigen::MatrixXd > data, std::default_random_engine &prng, unsigned int number_components, Eigen::Ref< Eigen::MatrixXd > centroids) const override
Initialises location of centroids.
ml::Clustering::KPP
Implements the K++ algorithm.
Definition: Clustering.hpp:108
ml::Clustering::ClosestCentroid
Initialises centroids and then assigns the responsibility for each point to its closest centroid.
Definition: Clustering.hpp:115