From 3d27c4c3b7b0103fee1f761edeae267c42a2d0b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Mon, 28 Nov 2022 10:15:03 +0100 Subject: [PATCH] Add Entropy method --- fimdlp/CPPFImdlp.cpp | 31 ++++++++++--------- fimdlp/Metrics.cpp | 40 +++++++++++++++++++++++++ fimdlp/Metrics.h | 16 ++++++++++ fimdlp/cppfimdlp.cpython-310-darwin.so | Bin 90872 -> 92328 bytes fimdlp/mdlp.py | 2 -- setup.py | 1 + 6 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 fimdlp/Metrics.cpp create mode 100644 fimdlp/Metrics.h diff --git a/fimdlp/CPPFImdlp.cpp b/fimdlp/CPPFImdlp.cpp index be825a6..990cd6a 100644 --- a/fimdlp/CPPFImdlp.cpp +++ b/fimdlp/CPPFImdlp.cpp @@ -1,6 +1,7 @@ #include "CPPFImdlp.h" #include #include +#include "Metrics.h" namespace CPPFImdlp { CPPFImdlp::CPPFImdlp() : debug(false), precision(6) @@ -17,33 +18,35 @@ namespace CPPFImdlp std::vector CPPFImdlp::cutPoints(std::vector &X, std::vector &y) { std::vector cutPts; - float antx, cutPoint; - int anty; + float xPrev, cutPoint; + int yPrev; std::vector indices = sortIndices(X); - antx = X.at(indices[0]); - anty = y.at(indices[0]); + xPrev = X.at(indices[0]); + yPrev = y.at(indices[0]); + if (debug) + { + std::cout << "Entropy: " << Metrics::entropy(y, 0, y.size(), Metrics::numClasses(y)) << std::endl; + } for (auto index = indices.begin(); index != indices.end(); ++index) { - // std::cout << X.at(*index) << " -> " << y.at(*index) << " // "; // Definition 2 Cut points are always on boundaries - if (y.at(*index) != anty && antx < X.at(*index)) - // Weka implementation - // if (antx < X.at(*index)) + if (y.at(*index) != yPrev && xPrev < X.at(*index)) { - cutPoint = round((X.at(*index) + antx) / 2 * divider) / divider; + cutPoint = round((X.at(*index) + xPrev) / 2 * divider) / divider; if (debug) { - std::cout << "Cut point: " << (antx + X.at(*index)) / 2 << " //"; - std::cout << X.at(*index) << " -> " << y.at(*index) << " anty= " << anty; - std::cout << "* (" << X.at(*index) << ", " << antx << ")=" << ((X.at(*index) + antx) / 2) << std::endl; + std::cout << "Cut point: " << (xPrev + X.at(*index)) / 2 << " //"; + std::cout << X.at(*index) << " -> " << y.at(*index) << " yPrev= " << yPrev; + std::cout << "* (" << X.at(*index) << ", " << xPrev << ")=" << ((X.at(*index) + xPrev) / 2) << std::endl; } cutPts.push_back(cutPoint); } - antx = X.at(*index); - anty = y.at(*index); + xPrev = X.at(*index); + yPrev = y.at(*index); } return cutPts; } + // Argsort from https://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes std::vector CPPFImdlp::sortIndices(std::vector &X) { std::vector idx(X.size()); diff --git a/fimdlp/Metrics.cpp b/fimdlp/Metrics.cpp new file mode 100644 index 0000000..81ec93c --- /dev/null +++ b/fimdlp/Metrics.cpp @@ -0,0 +1,40 @@ +#include "Metrics.h" +namespace CPPFImdlp +{ + Metrics::Metrics() + { + } + float Metrics::entropy(std::vector &y, int start, int end, int nClasses) + { + float entropy = 0; + int nElements = end - start; + std::vector + counts(nClasses, 0); + for (auto i = start; i < end; i++) + { + counts[y[i]]++; + } + for (auto i = 0; i < nClasses; i++) + { + if (counts[i] > 0) + { + float p = (float)counts[i] / nElements; + entropy -= p * log2(p); + } + } + return entropy; + } + int Metrics::numClasses(std::vector &y) + { + int nClasses = 1; + int yAnt = y.at(0); + for (auto i = y.begin(); i != y.end(); ++i) + { + if (*i != yAnt) + { + nClasses++; + } + } + return nClasses; + } +} diff --git a/fimdlp/Metrics.h b/fimdlp/Metrics.h new file mode 100644 index 0000000..f4da032 --- /dev/null +++ b/fimdlp/Metrics.h @@ -0,0 +1,16 @@ +#ifndef METRICS_H +#define METRICS_H +#include +#include +#include +namespace CPPFImdlp +{ + class Metrics + { + public: + Metrics(); + static float entropy(std::vector &, int, int, int); + static int numClasses(std::vector &); + }; +} +#endif \ No newline at end of file diff --git a/fimdlp/cppfimdlp.cpython-310-darwin.so b/fimdlp/cppfimdlp.cpython-310-darwin.so index e960773f11bfa29c7431a27729f0b311ec5b75b9..cb7a93161221dc5a538770440606e4c77e2a32d2 100755 GIT binary patch delta 16649 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 delta 14504 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 diff --git a/fimdlp/mdlp.py b/fimdlp/mdlp.py index 3959271..1e35334 100644 --- a/fimdlp/mdlp.py +++ b/fimdlp/mdlp.py @@ -95,10 +95,8 @@ class FImdlp(TransformerMixin, BaseEstimator): print("Cut points for each feature in Iris dataset:") yz = self.y_.copy() xz = X[:, 0].copy() - xzz = self.discretizer_.sort_vectors(xz, yz) print("Xz: ", xz) print("Yz: ", yz) - print("Xzz: ", xzz) print("Solución:") print("Xz*: ", np.sort(X[:, 0])) print("yz*: ", yz[np.argsort(X[:, 0])]) diff --git a/setup.py b/setup.py index 0c813a3..7851132 100644 --- a/setup.py +++ b/setup.py @@ -13,6 +13,7 @@ setup( sources=[ "fimdlp/cfimdlp.pyx", "fimdlp/CPPFImdlp.cpp", + "fimdlp/Metrics.cpp", ], language="c++", include_dirs=["fimdlp"],