From 3333adc395e388c82c91cfe85184f4ed0c831f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Sun, 27 Nov 2022 23:10:56 +0100 Subject: [PATCH] Impelement CutPoints 2 with points of view --- fimdlp/CPPFImdlp.cpp | 43 +++++++++++++++++-------- fimdlp/CPPFImdlp.h | 6 +++- fimdlp/cfimdlp.pyx | 2 +- fimdlp/cppfimdlp.cpython-310-darwin.so | Bin 84512 -> 87232 bytes fimdlp/mdlp.py | 15 +++++++-- sample.py | 8 +++-- setup.py | 6 +++- 7 files changed, 59 insertions(+), 21 deletions(-) diff --git a/fimdlp/CPPFImdlp.cpp b/fimdlp/CPPFImdlp.cpp index 5f9039b..0791b96 100644 --- a/fimdlp/CPPFImdlp.cpp +++ b/fimdlp/CPPFImdlp.cpp @@ -1,4 +1,6 @@ #include "CPPFImdlp.h" +#include +#include namespace CPPFImdlp { CPPFImdlp::CPPFImdlp() @@ -7,23 +9,38 @@ namespace CPPFImdlp CPPFImdlp::~CPPFImdlp() { } - std::vector CPPFImdlp::cutPoints(std::vector &X, std::vector &y) + std::vector CPPFImdlp::cutPoints(std::vector &X, std::vector &y) { - std::vector cutPts; - int i, ant = X.at(0), anty = y.at(0); - int n = X.size(); - for (i = 1; i < n; i++) + std::vector cutPts; + double antx; + // int anty; + std::vector indices = sortIndices(X); + antx = X.at(indices[0]); + // anty = y.at(indices[0]); + for (auto index = indices.begin(); index != indices.end(); ++index) { - if (X.at(i) != ant) + // 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(i) != anty) - { - cutPts.push_back(float(X.at(i) + ant) / 2); - ant = X.at(i); - anty = y.at(i); - } + // std::cout << "* (" << X.at(*index) << ", " << antx << ") // "; + cutPts.push_back((X.at(*index) + antx) / 2); + // anty = y.at(*index); } + antx = X.at(*index); } + // std::cout << std::endl; return cutPts; } -} \ No newline at end of file + std::vector CPPFImdlp::sortIndices(std::vector &X) + { + std::vector idx(X.size()); + std::iota(idx.begin(), idx.end(), 0); + for (std::size_t i = 0; i < X.size(); i++) + stable_sort(idx.begin(), idx.end(), [&X](size_t i1, size_t i2) + { return X[i1] < X[i2]; }); + return idx; + } +} diff --git a/fimdlp/CPPFImdlp.h b/fimdlp/CPPFImdlp.h index 81f589a..7c01eb1 100644 --- a/fimdlp/CPPFImdlp.h +++ b/fimdlp/CPPFImdlp.h @@ -2,14 +2,18 @@ #define CPPFIMDLP_H #include #include +#include namespace CPPFImdlp { class CPPFImdlp { + private: + std::vector sortIndices(std::vector &); + public: CPPFImdlp(); ~CPPFImdlp(); - std::vector cutPoints(std::vector &, std::vector &); + std::vector cutPoints(std::vector &, std::vector &); }; } #endif \ No newline at end of file diff --git a/fimdlp/cfimdlp.pyx b/fimdlp/cfimdlp.pyx index 8317808..33f7542 100644 --- a/fimdlp/cfimdlp.pyx +++ b/fimdlp/cfimdlp.pyx @@ -5,7 +5,7 @@ from libcpp.vector cimport vector cdef extern from "CPPFImdlp.h" namespace "CPPFImdlp": cdef cppclass CPPFImdlp: CPPFImdlp() except + - vector[float] cutPoints(vector[int]&, vector[int]&) + vector[double] cutPoints(vector[float]&, vector[int]&) cdef class CFImdlp: cdef CPPFImdlp *thisptr diff --git a/fimdlp/cppfimdlp.cpython-310-darwin.so b/fimdlp/cppfimdlp.cpython-310-darwin.so index 4e5cb5bf2e06162c72a3319b177acc7ce7fdf20f..633001c08344f95056eec601941ae5d296c33a5e 100755 GIT binary patch literal 87232 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�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 Gbp9939%Rn| diff --git a/fimdlp/mdlp.py b/fimdlp/mdlp.py index 34584d0..14888b3 100644 --- a/fimdlp/mdlp.py +++ b/fimdlp/mdlp.py @@ -96,8 +96,17 @@ class FImdlp(TransformerMixin, BaseEstimator): "Shape of input is different from what was seen" "in `fit`" ) print("Cut points for each feature in Iris dataset:") - for i in range(0, self.n_features_): - data = np.sort(X[:, i]) - Xcutpoints = self.discretizer_.cut_points(data, self.y_) + 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])]) + for i in range(0, 1): # self.n_features_): + datax = np.sort(X[:, i]) + Xcutpoints = self.discretizer_.cut_points(datax, self.y_) print(f"{self.features_[i]:20s}: {Xcutpoints}") return X diff --git a/sample.py b/sample.py index 85f43d8..162268e 100644 --- a/sample.py +++ b/sample.py @@ -1,9 +1,13 @@ from sklearn.datasets import load_iris from fimdlp.mdlp import FImdlp +from fimdlp.cppfimdlp import CFImdlp data = load_iris() X = data.data y = data.target features = data.feature_names -test = FImdlp() -Xcutpoints = test.fit(X, y, features=features).transform(X) +# test = FImdlp() +# Xcutpoints = test.fit(X, y, features=features).transform(X) +clf = CFImdlp() +print("Cut points for feature 0 in Iris dataset:") +print(clf.cut_points(X[:, 0], y)) diff --git a/setup.py b/setup.py index 6e9a25d..0c813a3 100644 --- a/setup.py +++ b/setup.py @@ -10,9 +10,13 @@ setup( ext_modules=[ Extension( name="cppfimdlp", - sources=["fimdlp/cfimdlp.pyx", "fimdlp/CPPFImdlp.cpp"], + sources=[ + "fimdlp/cfimdlp.pyx", + "fimdlp/CPPFImdlp.cpp", + ], language="c++", include_dirs=["fimdlp"], + extra_compile_args=["-std=c++20"], ), ] )