Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-06-26 07:05:14

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2022 Chao Peng, Whitney Armstrong
0003 
0004 #pragma once
0005 
0006 #include <Eigen/Dense>
0007 
0008 namespace fkc {
0009 
0010   /**  Fuzzy K Clustering Algorithms
0011    *
0012    *
0013    * \ingroup reco
0014    */
0015   class KMeans {
0016   public:
0017     KMeans();
0018     virtual ~KMeans();
0019 
0020     virtual Eigen::MatrixXd Fit(const Eigen::MatrixXd& data, int k, double q = 2.0, double epsilon = 1e-4,
0021                                 int max_iters = 1000);
0022 
0023     int                    NIters() const { return n_iters; }
0024     double                 Variance() const { return variance; }
0025     const Eigen::MatrixXd& GetDistances() const { return dists; }
0026     const Eigen::MatrixXd& GetMemberships() const { return mems; }
0027 
0028     Eigen::MatrixXd& GetDistances() { return dists; }
0029     Eigen::MatrixXd& GetMemberships() { return mems; }
0030 
0031   protected:
0032     virtual Eigen::MatrixXd Initialize(const Eigen::MatrixXd& data, int k, double q);
0033     virtual void            Distances(const Eigen::MatrixXd& centroids, const Eigen::MatrixXd& data);
0034     virtual void            Memberships(double q);
0035     virtual void            FormClusters(Eigen::MatrixXd& clusters, const Eigen::MatrixXd& data, double q);
0036 
0037   protected:
0038     int             n_iters{0};
0039     double          variance{0};
0040     Eigen::MatrixXd dists, mems;
0041   };
0042 
0043   class KRings : public KMeans {
0044   public:
0045     KRings();
0046     ~KRings();
0047 
0048     virtual Eigen::MatrixXd Fit(const Eigen::MatrixXd& data, int k, double q = 2.0, double epsilon = 1e-4,
0049                                 int max_iters = 1000);
0050 
0051   protected:
0052     virtual Eigen::MatrixXd Initialize(const Eigen::MatrixXd& data, int k, double q);
0053     virtual void            Distances(const Eigen::MatrixXd& centroids, const Eigen::MatrixXd& data);
0054     virtual void            FormClusters(Eigen::MatrixXd& clusters, const Eigen::MatrixXd& data, double q);
0055     virtual void            FormRadii(Eigen::MatrixXd& clusters, double g);
0056 
0057   protected:
0058     Eigen::MatrixXd dists_euc;
0059   };
0060 
0061 } // namespace fkc