File indexing completed on 2025-01-30 10:30:22
0001
0002
0003
0004 #pragma once
0005
0006 #include <Eigen/Dense>
0007
0008 namespace fkc {
0009
0010
0011
0012
0013
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 }