From 65de064fa90cab1cab12c5a48d26ed934cc68dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Fri, 9 Dec 2022 16:35:58 +0100 Subject: [PATCH] Refactor project structure and add Arff load and test --- fimdlp/CPPFImdlp.cpp | 1 + fimdlp/Metrics.cpp | 16 +- fimdlp/{tests => }/bak/CPPFImdlp.cpp | 0 fimdlp/{tests => }/bak/CPPFImdlp.h | 0 fimdlp/{tests => }/bak/Metrics.cpp | 0 fimdlp/{tests => }/bak/Metrics.h | 0 fimdlp/testcpp/ArffFiles.cpp | 117 ++++++ fimdlp/testcpp/ArffFiles.h | 28 ++ fimdlp/testcpp/FImdlp_unittest.cc | 354 +++++++++--------- fimdlp/testcpp/datasets/iris.arff | 225 +++++++++++ .../testcpp/datasets/kdd_JapaneseVowels.arff | 0 .../testcpp/datasets/letter.arff | 0 .../testcpp/datasets/mfeat-factors.arff | 0 fimdlp/testcpp/main | Bin 0 -> 498257 bytes fimdlp/testcpp/main.cpp | 57 +++ fimdlp/testcpp/xx/ArffFiles.cpp | 111 ++++++ fimdlp/testcpp/xx/ArffFiles.h | 28 ++ fimdlp/testcpp/xx/CMakeLists.txt | 6 + fimdlp/testcpp/xx/main.cpp | 30 ++ sample.py | 63 ---- 20 files changed, 783 insertions(+), 253 deletions(-) rename fimdlp/{tests => }/bak/CPPFImdlp.cpp (100%) rename fimdlp/{tests => }/bak/CPPFImdlp.h (100%) rename fimdlp/{tests => }/bak/Metrics.cpp (100%) rename fimdlp/{tests => }/bak/Metrics.h (100%) create mode 100644 fimdlp/testcpp/ArffFiles.cpp create mode 100644 fimdlp/testcpp/ArffFiles.h create mode 100755 fimdlp/testcpp/datasets/iris.arff rename kdd_JapaneseVowels.arff => fimdlp/testcpp/datasets/kdd_JapaneseVowels.arff (100%) rename letter.arff => fimdlp/testcpp/datasets/letter.arff (100%) rename mfeat-factors.arff => fimdlp/testcpp/datasets/mfeat-factors.arff (100%) create mode 100755 fimdlp/testcpp/main create mode 100644 fimdlp/testcpp/main.cpp create mode 100644 fimdlp/testcpp/xx/ArffFiles.cpp create mode 100644 fimdlp/testcpp/xx/ArffFiles.h create mode 100644 fimdlp/testcpp/xx/CMakeLists.txt create mode 100644 fimdlp/testcpp/xx/main.cpp diff --git a/fimdlp/CPPFImdlp.cpp b/fimdlp/CPPFImdlp.cpp index 8113c55..e5b6c4e 100644 --- a/fimdlp/CPPFImdlp.cpp +++ b/fimdlp/CPPFImdlp.cpp @@ -19,6 +19,7 @@ namespace mdlp { { X = X_; y = y_; + cutPoints.clear(); if (X.size() != y.size()) { throw invalid_argument("X and y must have the same size"); } diff --git a/fimdlp/Metrics.cpp b/fimdlp/Metrics.cpp index 041ecf4..f2e54f5 100644 --- a/fimdlp/Metrics.cpp +++ b/fimdlp/Metrics.cpp @@ -1,6 +1,5 @@ #include "Metrics.h" #include -#include using namespace std; namespace mdlp { Metrics::Metrics(labels& y_, indices_t& indices_): y(y_), indices(indices_), numClasses(computeNumClasses(0, indices.size())), entropyCache(cacheEnt_t()), igCache(cacheIg_t()) @@ -19,6 +18,8 @@ namespace mdlp { indices = indices_; y = y_; numClasses = computeNumClasses(0, indices.size()); + entropyCache.clear(); + igCache.clear(); } precision_t Metrics::entropy(size_t start, size_t end) { @@ -50,7 +51,6 @@ namespace mdlp { int nElementsLeft = cut - start, nElementsRight = end - cut; int nElements = end - start; if (igCache.find(make_tuple(start, cut, end)) != igCache.end()) { - cout << "**********Cache IG hit for " << start << " " << end << endl; return igCache[make_tuple(start, cut, end)]; } entropyInterval = entropy(start, end); @@ -61,14 +61,4 @@ namespace mdlp { return iGain; } -} -/* - cache_t entropyCache; - std::map, double> c; - - // Set the value at index (3, 5) to 7.8. - c[std::make_tuple(3, 5)] = 7.8; - - // Print the value at index (3, 5). - std::cout << c[std::make_tuple(3, 5)] << std::endl; -*/ \ No newline at end of file +} \ No newline at end of file diff --git a/fimdlp/tests/bak/CPPFImdlp.cpp b/fimdlp/bak/CPPFImdlp.cpp similarity index 100% rename from fimdlp/tests/bak/CPPFImdlp.cpp rename to fimdlp/bak/CPPFImdlp.cpp diff --git a/fimdlp/tests/bak/CPPFImdlp.h b/fimdlp/bak/CPPFImdlp.h similarity index 100% rename from fimdlp/tests/bak/CPPFImdlp.h rename to fimdlp/bak/CPPFImdlp.h diff --git a/fimdlp/tests/bak/Metrics.cpp b/fimdlp/bak/Metrics.cpp similarity index 100% rename from fimdlp/tests/bak/Metrics.cpp rename to fimdlp/bak/Metrics.cpp diff --git a/fimdlp/tests/bak/Metrics.h b/fimdlp/bak/Metrics.h similarity index 100% rename from fimdlp/tests/bak/Metrics.h rename to fimdlp/bak/Metrics.h diff --git a/fimdlp/testcpp/ArffFiles.cpp b/fimdlp/testcpp/ArffFiles.cpp new file mode 100644 index 0000000..b8a8928 --- /dev/null +++ b/fimdlp/testcpp/ArffFiles.cpp @@ -0,0 +1,117 @@ +#include "ArffFiles.h" + +#include +#include +#include +#include + +using namespace std; + +ArffFiles::ArffFiles() +{ +} +vector ArffFiles::getLines() +{ + return lines; +} +unsigned long int ArffFiles::getSize() +{ + return lines.size(); +} +vector> ArffFiles::getAttributes() +{ + return attributes; +} +string ArffFiles::getClassName() +{ + return className; +} +string ArffFiles::getClassType() +{ + return classType; +} +vector>& ArffFiles::getX() +{ + return X; +} +vector& ArffFiles::getY() +{ + return y; +} +void ArffFiles::load(string fileName, bool classLast) +{ + ifstream file(fileName); + string keyword, attribute, type; + if (file.is_open()) { + string line; + while (getline(file, line)) { + if (line[0] == '%' || line.empty() || line == "\r" || line == " ") { + continue; + } + if (line.find("@attribute") != string::npos || line.find("@ATTRIBUTE") != string::npos) { + stringstream ss(line); + ss >> keyword >> attribute >> type; + attributes.push_back(make_tuple(attribute, type)); + continue; + } + if (line[0] == '@') { + continue; + } + lines.push_back(line); + } + file.close(); + if (attributes.empty()) + throw invalid_argument("No attributes found"); + if (classLast) { + className = get<0>(attributes.back()); + classType = get<1>(attributes.back()); + attributes.pop_back(); + } else { + className = get<0>(attributes.front()); + classType = get<1>(attributes.front()); + attributes.erase(attributes.begin()); + } + generateDataset(classLast); + } else + throw invalid_argument("Unable to open file"); +} +void ArffFiles::generateDataset(bool classLast) +{ + X = vector>(attributes.size(), vector(lines.size())); + vector yy = vector(lines.size(), ""); + int labelIndex = classLast ? attributes.size() : 0; + for (int i = 0; i < lines.size(); i++) { + stringstream ss(lines[i]); + string value; + int pos = 0, xIndex = 0; + while (getline(ss, value, ',')) { + if (pos++ == labelIndex) { + yy[i] = value; + } else { + X[xIndex++][i] = stof(value); + } + } + } + y = factorize(yy); +} +string ArffFiles::trim(const string& source) +{ + string s(source); + s.erase(0, s.find_first_not_of(" \n\r\t")); + s.erase(s.find_last_not_of(" \n\r\t") + 1); + return s; +} +vector ArffFiles::factorize(const vector& labels) +{ + vector yy; + yy.reserve(labels.size()); + map labelMap; + int i = 0; + for (string label : labels) { + if (labelMap.find(label) == labelMap.end()) { + labelMap[label] = i++; + } + yy.push_back(labelMap[label]); + } + return yy; +} \ No newline at end of file diff --git a/fimdlp/testcpp/ArffFiles.h b/fimdlp/testcpp/ArffFiles.h new file mode 100644 index 0000000..317ebb5 --- /dev/null +++ b/fimdlp/testcpp/ArffFiles.h @@ -0,0 +1,28 @@ +#ifndef ARFFFILES_H +#define ARFFFILES_H +#include +#include +#include +using namespace std; +class ArffFiles { +private: + vector lines; + vector> attributes; + string className, classType; + vector> X; + vector y; + void generateDataset(bool); +public: + ArffFiles(); + void load(string, bool = true); + vector getLines(); + unsigned long int getSize(); + string getClassName(); + string getClassType(); + string trim(const string&); + vector>& getX(); + vector& getY(); + vector> getAttributes(); + vector factorize(const vector& labels); +}; +#endif \ No newline at end of file diff --git a/fimdlp/testcpp/FImdlp_unittest.cc b/fimdlp/testcpp/FImdlp_unittest.cc index 3bdc69d..173bd41 100644 --- a/fimdlp/testcpp/FImdlp_unittest.cc +++ b/fimdlp/testcpp/FImdlp_unittest.cc @@ -1,177 +1,177 @@ -#include "gtest/gtest.h" -#include "../Metrics.h" -#include "../CPPFImdlp.h" -namespace mdlp { - class TestFImdlp : public CPPFImdlp, public testing::Test { - public: - TestFImdlp() : CPPFImdlp(true, 6, true) {} - void SetUp() - { - // 5.0, 5.1, 5.1, 5.1, 5.2, 5.3, 5.6, 5.7, 5.9, 6.0] - //(5.0, 1) (5.1, 1) (5.1, 2) (5.1, 2) (5.2, 1) (5.3, 1) (5.6, 2) (5.7, 1) (5.9, 2) (6.0, 2) - X = { 5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9 }; - y = { 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; - fit(X, y); - } - void setProposal(bool value) - { - proposal = value; - } - void initCutPoints() - { - setCutPoints(cutPoints_t()); - } - void initIndices() - { - indices = indices_t(); - } - void initDiscretized() - { - xDiscretized = labels(); - } - void checkSortedVector(samples& X_, indices_t indices_) - { - X = X_; - indices = indices_; - indices_t testSortedIndices = sortIndices(X); - precision_t prev = X[testSortedIndices[0]]; - for (auto i = 0; i < X.size(); ++i) { - EXPECT_EQ(testSortedIndices[i], indices[i]); - EXPECT_LE(prev, X[testSortedIndices[i]]); - prev = X[testSortedIndices[i]]; - } - } - void checkCutPoints(cutPoints_t& expected) - { - int expectedSize = expected.size(); - EXPECT_EQ(cutPoints.size(), expectedSize); - for (auto i = 0; i < expectedSize; i++) { - EXPECT_EQ(cutPoints[i].start, expected[i].start); - EXPECT_EQ(cutPoints[i].end, expected[i].end); - EXPECT_EQ(cutPoints[i].classNumber, expected[i].classNumber); - EXPECT_NEAR(cutPoints[i].fromValue, expected[i].fromValue, precision); - EXPECT_NEAR(cutPoints[i].toValue, expected[i].toValue, precision); - } - } - template - void checkVectors(std::vector const& expected, std::vector const& computed) - { - EXPECT_EQ(expected.size(), computed.size()); - for (auto i = 0; i < expected.size(); i++) { - EXPECT_EQ(expected[i], computed[i]); - } - } - - }; - TEST_F(TestFImdlp, FitErrorEmptyDataset) - { - X = samples(); - y = labels(); - EXPECT_THROW(fit(X, y), std::invalid_argument); - } - TEST_F(TestFImdlp, FitErrorDifferentSize) - { - X = { 1, 2, 3 }; - y = { 1, 2 }; - EXPECT_THROW(fit(X, y), std::invalid_argument); - } - TEST_F(TestFImdlp, SortIndices) - { - X = { 5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9 }; - indices = { 4, 3, 6, 8, 2, 1, 5, 0, 9, 7 }; - checkSortedVector(X, indices); - X = { 5.77, 5.88, 5.99 }; - indices = { 0, 1, 2 }; - checkSortedVector(X, indices); - X = { 5.33, 5.22, 5.11 }; - indices = { 2, 1, 0 }; - checkSortedVector(X, indices); - } - TEST_F(TestFImdlp, EvaluateCutPoint) - { - cutPoint_t rest, candidate; - rest = { 0, 10, -1, -1, 1000 }; - candidate = { 0, 4, -1, -1, 5.15 }; - EXPECT_FALSE(evaluateCutPoint(rest, candidate)); - } - TEST_F(TestFImdlp, ComputeCutPointsOriginal) - { - cutPoints_t expected; - expected = { - { 0, 4, -1, -3.4028234663852886e+38, 5.15 }, { 4, 6, -1, 5.15, 5.45 }, - { 6, 10, -1, 5.45, 3.4028234663852886e+38 } - }; - setCutPoints(cutPoints_t()); - computeCutPointsOriginal(); - checkCutPoints(expected); - } - TEST_F(TestFImdlp, ComputeCutPointsOriginalGCase) - { - cutPoints_t expected; - expected = { - { 0, 4, -1, -3.4028234663852886e+38, 3.4028234663852886e+38 }, - }; - X = { 0, 1, 2, 2 }; - y = { 1, 1, 1, 2 }; - fit(X, y); - computeCutPointsOriginal(); - checkCutPoints(expected); - } - TEST_F(TestFImdlp, ComputeCutPointsProposal) - { - cutPoints_t expected; - expected = { - { 0, 4, -1, -3.4028234663852886e+38, 5.1 }, { 4, 6, -1, 5.1, 5.4 }, - { 6, 9, -1, 5.4, 5.85 }, - { 9, 10, -1, 5.85, 3.4028234663852886e+38 } - }; - computeCutPointsProposal(); - checkCutPoints(expected); - } - TEST_F(TestFImdlp, ComputeCutPointsProposalGCase) - { - cutPoints_t expected; - expected = { - { 0, 3, -1, -3.4028234663852886e+38, 1.5 }, - { 3, 4, -1, 1.5, 3.4028234663852886e+38 } - }; - X = { 0, 1, 2, 2 }; - y = { 1, 1, 1, 2 }; - fit(X, y); - computeCutPointsProposal(); - checkCutPoints(expected); - } - TEST_F(TestFImdlp, DiscretizedValues) - { - labels computed, expected = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - computed = getDiscretizedValues(); - checkVectors(expected, computed); - } - TEST_F(TestFImdlp, GetCutPoints) - { - samples computed, expected = { 5.15, 5.45, 3.4028234663852886e+38 }; - computeCutPointsOriginal(); - computed = getCutPoints(); - checkVectors(expected, computed); - } - TEST_F(TestFImdlp, Constructor) - { - samples X = { 5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9 }; - labels y = { 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; - setProposal(false); - fit(X, y); - computeCutPointsOriginal(); - cutPoints_t expected; - vector computed = getCutPoints(); - expected = { - { 0, 4, -1, -3.4028234663852886e+38, 5.15 }, { 4, 6, -1, 5.15, 5.45 }, - { 6, 10, -1, 5.45, 3.4028234663852886e+38 } - }; - computed = getCutPoints(); - int expectedSize = expected.size(); - EXPECT_EQ(computed.size(), expected.size()); - for (auto i = 0; i < expectedSize; i++) { - EXPECT_NEAR(computed[i], expected[i].toValue, .00000001); - } - } -} \ No newline at end of file +//#include "gtest/gtest.h" +//#include "../Metrics.h" +//#include "../CPPFImdlp.h" +//namespace mdlp { +// class TestFImdlp : public CPPFImdlp, public testing::Test { +// public: +// TestFImdlp() : CPPFImdlp(true, true) {} +// void SetUp() +// { +// // 5.0, 5.1, 5.1, 5.1, 5.2, 5.3, 5.6, 5.7, 5.9, 6.0] +// //(5.0, 1) (5.1, 1) (5.1, 2) (5.1, 2) (5.2, 1) (5.3, 1) (5.6, 2) (5.7, 1) (5.9, 2) (6.0, 2) +// X = { 5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9 }; +// y = { 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; +// fit(X, y); +// } +// void setProposal(bool value) +// { +// proposal = value; +// } +// void initCutPoints() +// { +// setCutPoints(cutPoints_t()); +// } +// void initIndices() +// { +// indices = indices_t(); +// } +// void initDiscretized() +// { +// xDiscretized = labels(); +// } +// void checkSortedVector(samples& X_, indices_t indices_) +// { +// X = X_; +// indices = indices_; +// indices_t testSortedIndices = sortIndices(X); +// precision_t prev = X[testSortedIndices[0]]; +// for (auto i = 0; i < X.size(); ++i) { +// EXPECT_EQ(testSortedIndices[i], indices[i]); +// EXPECT_LE(prev, X[testSortedIndices[i]]); +// prev = X[testSortedIndices[i]]; +// } +// } +// void checkCutPoints(cutPoints_t& expected) +// { +// int expectedSize = expected.size(); +// EXPECT_EQ(cutPoints.size(), expectedSize); +// for (auto i = 0; i < expectedSize; i++) { +// EXPECT_EQ(cutPoints[i].start, expected[i].start); +// EXPECT_EQ(cutPoints[i].end, expected[i].end); +// EXPECT_EQ(cutPoints[i].classNumber, expected[i].classNumber); +// EXPECT_NEAR(cutPoints[i].fromValue, expected[i].fromValue, precision); +// EXPECT_NEAR(cutPoints[i].toValue, expected[i].toValue, precision); +// } +// } +// template +// void checkVectors(std::vector const& expected, std::vector const& computed) +// { +// EXPECT_EQ(expected.size(), computed.size()); +// for (auto i = 0; i < expected.size(); i++) { +// EXPECT_EQ(expected[i], computed[i]); +// } +// } +// +// }; +// TEST_F(TestFImdlp, FitErrorEmptyDataset) +// { +// X = samples(); +// y = labels(); +// EXPECT_THROW(fit(X, y), std::invalid_argument); +// } +// TEST_F(TestFImdlp, FitErrorDifferentSize) +// { +// X = { 1, 2, 3 }; +// y = { 1, 2 }; +// EXPECT_THROW(fit(X, y), std::invalid_argument); +// } +// TEST_F(TestFImdlp, SortIndices) +// { +// X = { 5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9 }; +// indices = { 4, 3, 6, 8, 2, 1, 5, 0, 9, 7 }; +// checkSortedVector(X, indices); +// X = { 5.77, 5.88, 5.99 }; +// indices = { 0, 1, 2 }; +// checkSortedVector(X, indices); +// X = { 5.33, 5.22, 5.11 }; +// indices = { 2, 1, 0 }; +// checkSortedVector(X, indices); +// } +// TEST_F(TestFImdlp, EvaluateCutPoint) +// { +// cutPoint_t rest, candidate; +// rest = { 0, 10, -1, -1, 1000 }; +// candidate = { 0, 4, -1, -1, 5.15 }; +// EXPECT_FALSE(evaluateCutPoint(rest, candidate)); +// } +// TEST_F(TestFImdlp, ComputeCutPointsOriginal) +// { +// cutPoints_t expected; +// expected = { +// { 0, 4, -1, -3.4028234663852886e+38, 5.15 }, { 4, 6, -1, 5.15, 5.45 }, +// { 6, 10, -1, 5.45, 3.4028234663852886e+38 } +// }; +// setCutPoints(cutPoints_t()); +// computeCutPointsOriginal(); +// checkCutPoints(expected); +// } +// TEST_F(TestFImdlp, ComputeCutPointsOriginalGCase) +// { +// cutPoints_t expected; +// expected = { +// { 0, 4, -1, -3.4028234663852886e+38, 3.4028234663852886e+38 }, +// }; +// X = { 0, 1, 2, 2 }; +// y = { 1, 1, 1, 2 }; +// fit(X, y); +// computeCutPointsOriginal(); +// checkCutPoints(expected); +// } +// TEST_F(TestFImdlp, ComputeCutPointsProposal) +// { +// cutPoints_t expected; +// expected = { +// { 0, 4, -1, -3.4028234663852886e+38, 5.1 }, { 4, 6, -1, 5.1, 5.4 }, +// { 6, 9, -1, 5.4, 5.85 }, +// { 9, 10, -1, 5.85, 3.4028234663852886e+38 } +// }; +// computeCutPointsProposal(); +// checkCutPoints(expected); +// } +// TEST_F(TestFImdlp, ComputeCutPointsProposalGCase) +// { +// cutPoints_t expected; +// expected = { +// { 0, 3, -1, -3.4028234663852886e+38, 1.5 }, +// { 3, 4, -1, 1.5, 3.4028234663852886e+38 } +// }; +// X = { 0, 1, 2, 2 }; +// y = { 1, 1, 1, 2 }; +// fit(X, y); +// computeCutPointsProposal(); +// checkCutPoints(expected); +// } +// TEST_F(TestFImdlp, DiscretizedValues) +// { +// labels computed, expected = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +// computed = getDiscretizedValues(); +// checkVectors(expected, computed); +// } +// TEST_F(TestFImdlp, GetCutPoints) +// { +// samples computed, expected = { 5.15, 5.45, 3.4028234663852886e+38 }; +// computeCutPointsOriginal(); +// computed = getCutPoints(); +// checkVectors(expected, computed); +// } +// TEST_F(TestFImdlp, Constructor) +// { +// samples X = { 5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9 }; +// labels y = { 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }; +// setProposal(false); +// fit(X, y); +// computeCutPointsOriginal(); +// cutPoints_t expected; +// vector computed = getCutPoints(); +// expected = { +// { 0, 4, -1, -3.4028234663852886e+38, 5.15 }, { 4, 6, -1, 5.15, 5.45 }, +// { 6, 10, -1, 5.45, 3.4028234663852886e+38 } +// }; +// computed = getCutPoints(); +// int expectedSize = expected.size(); +// EXPECT_EQ(computed.size(), expected.size()); +// for (auto i = 0; i < expectedSize; i++) { +// EXPECT_NEAR(computed[i], expected[i].toValue, .00000001); +// } +// } +//} \ No newline at end of file diff --git a/fimdlp/testcpp/datasets/iris.arff b/fimdlp/testcpp/datasets/iris.arff new file mode 100755 index 0000000..780480c --- /dev/null +++ b/fimdlp/testcpp/datasets/iris.arff @@ -0,0 +1,225 @@ +% 1. Title: Iris Plants Database +% +% 2. Sources: +% (a) Creator: R.A. Fisher +% (b) Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov) +% (c) Date: July, 1988 +% +% 3. Past Usage: +% - Publications: too many to mention!!! Here are a few. +% 1. Fisher,R.A. "The use of multiple measurements in taxonomic problems" +% Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions +% to Mathematical Statistics" (John Wiley, NY, 1950). +% 2. Duda,R.O., & Hart,P.E. (1973) Pattern Classification and Scene Analysis. +% (Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218. +% 3. Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System +% Structure and Classification Rule for Recognition in Partially Exposed +% Environments". IEEE Transactions on Pattern Analysis and Machine +% Intelligence, Vol. PAMI-2, No. 1, 67-71. +% -- Results: +% -- very low misclassification rates (0% for the setosa class) +% 4. Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule". IEEE +% Transactions on Information Theory, May 1972, 431-433. +% -- Results: +% -- very low misclassification rates again +% 5. See also: 1988 MLC Proceedings, 54-64. Cheeseman et al's AUTOCLASS II +% conceptual clustering system finds 3 classes in the data. +% +% 4. Relevant Information: +% --- This is perhaps the best known database to be found in the pattern +% recognition literature. Fisher's paper is a classic in the field +% and is referenced frequently to this day. (See Duda & Hart, for +% example.) The data set contains 3 classes of 50 instances each, +% where each class refers to a type of iris plant. One class is +% linearly separable from the other 2; the latter are NOT linearly +% separable from each other. +% --- Predicted attribute: class of iris plant. +% --- This is an exceedingly simple domain. +% +% 5. Number of Instances: 150 (50 in each of three classes) +% +% 6. Number of Attributes: 4 numeric, predictive attributes and the class +% +% 7. Attribute Information: +% 1. sepal length in cm +% 2. sepal width in cm +% 3. petal length in cm +% 4. petal width in cm +% 5. class: +% -- Iris Setosa +% -- Iris Versicolour +% -- Iris Virginica +% +% 8. Missing Attribute Values: None +% +% Summary Statistics: +% Min Max Mean SD Class Correlation +% sepal length: 4.3 7.9 5.84 0.83 0.7826 +% sepal width: 2.0 4.4 3.05 0.43 -0.4194 +% petal length: 1.0 6.9 3.76 1.76 0.9490 (high!) +% petal width: 0.1 2.5 1.20 0.76 0.9565 (high!) +% +% 9. Class Distribution: 33.3% for each of 3 classes. + +@RELATION iris + +@ATTRIBUTE sepallength REAL +@ATTRIBUTE sepalwidth REAL +@ATTRIBUTE petallength REAL +@ATTRIBUTE petalwidth REAL +@ATTRIBUTE class {Iris-setosa,Iris-versicolor,Iris-virginica} + +@DATA +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica +% +% +% diff --git a/kdd_JapaneseVowels.arff b/fimdlp/testcpp/datasets/kdd_JapaneseVowels.arff similarity index 100% rename from kdd_JapaneseVowels.arff rename to fimdlp/testcpp/datasets/kdd_JapaneseVowels.arff diff --git a/letter.arff b/fimdlp/testcpp/datasets/letter.arff similarity index 100% rename from letter.arff rename to fimdlp/testcpp/datasets/letter.arff diff --git a/mfeat-factors.arff b/fimdlp/testcpp/datasets/mfeat-factors.arff similarity index 100% rename from mfeat-factors.arff rename to fimdlp/testcpp/datasets/mfeat-factors.arff diff --git a/fimdlp/testcpp/main b/fimdlp/testcpp/main new file mode 100755 index 0000000000000000000000000000000000000000..8159308ed382e8dc8badcb6445cbee8e30f8f9f7 GIT binary patch literal 498257 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 cP>P%|2;Xa_}J}HaW(Kto^(fu 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%0De54Z7h1Ltin*6Nxn9 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 literal 0 HcmV?d00001 diff --git a/fimdlp/testcpp/main.cpp b/fimdlp/testcpp/main.cpp new file mode 100644 index 0000000..155a93f --- /dev/null +++ b/fimdlp/testcpp/main.cpp @@ -0,0 +1,57 @@ +#include "ArffFiles.h" +#include +#include +#include +#include "../CPPFImdlp.h" + +using namespace std; + +int main(int argc, char** argv) +{ + ArffFiles file; + vector lines; + string path = "/Users/rmontanana/Code/FImdlp/fimdlp/testcpp/datasets/"; + map datasets = { + {"mfeat-factors", true}, + {"iris", true}, + {"letter", true}, + {"kdd_JapaneseVowels", false} + }; + if (argc != 2 || datasets.find(argv[1]) == datasets.end()) { + cout << "Usage: " << argv[0] << " {mfeat-factors, iris, letter, kdd_JapaneseVowels}" << endl; + return 1; + } + + //file.load("datasets/mfeat-factors.arff", true); + //file.load("/Users/rmontanana/Code/FImdlp/fimdlp/testcpp/datasets/kdd_JapaneseVowels.arff", false); + //file.load("/Users/rmontanana/Code/FImdlp/fimdlp/testcpp/datasets/iris.arff", true); + file.load(path + argv[1] + ".arff", datasets[argv[1]]); + auto attributes = file.getAttributes(); + int items = file.getSize(); + cout << "Number of lines: " << items << endl; + cout << "Attributes: " << endl; + for (auto attribute : attributes) { + cout << "Name: " << get<0>(attribute) << " Type: " << get<1>(attribute) << endl; + } + cout << "Class name: " << file.getClassName() << endl; + cout << "Class type: " << file.getClassType() << endl; + cout << "Data: " << endl; + vector>& X = file.getX(); + vector& y = file.getY(); + for (int i = 0; i < 50; i++) { + for (auto feature : X) { + cout << fixed << setprecision(1) << feature[i] << " "; + } + cout << y[i] << endl; + } + mdlp::CPPFImdlp test = mdlp::CPPFImdlp(); + for (auto i = 0; i < attributes.size(); i++) { + cout << "Cut points for " << get<0>(attributes[i]) << endl; + cout << "--------------------------" << setprecision(3) << endl; + test.fit(X[i], y); + for (auto item : test.getCutPoints()) { + cout << item << endl; + } + } + return 0; +} diff --git a/fimdlp/testcpp/xx/ArffFiles.cpp b/fimdlp/testcpp/xx/ArffFiles.cpp new file mode 100644 index 0000000..a65576d --- /dev/null +++ b/fimdlp/testcpp/xx/ArffFiles.cpp @@ -0,0 +1,111 @@ +#include "ArffFiles.h" + +#include +#include +#include +#include + +using namespace std; + +ArffFiles::ArffFiles() +{ +} +vector ArffFiles::getLines() +{ + return lines; +} +unsigned long int ArffFiles::getSize() +{ + return lines.size(); +} +vector> ArffFiles::getAttributes() +{ + return attributes; +} +string ArffFiles::getClassName() +{ + return className; +} +string ArffFiles::getClassType() +{ + return classType; +} +vector>& ArffFiles::getX() +{ + return X; +} +vector& ArffFiles::getY() +{ + return y; +} +void ArffFiles::load(string fileName) +{ + ifstream file(fileName); + string keyword, attribute, type; + if (file.is_open()) { + string line; + while (getline(file, line)) { + if (line[0] == '%' || line.empty() || line == "\r" || line == " ") { + continue; + } + if (line.find("@attribute") != string::npos || line.find("@ATTRIBUTE") != string::npos) { + stringstream ss(line); + ss >> keyword >> attribute >> type; + attributes.push_back(make_tuple(attribute, type)); + continue; + } + if (line[0] == '@') { + continue; + } + lines.push_back(line); + } + file.close(); + if (attributes.empty()) + throw invalid_argument("No attributes found"); + className = get<0>(attributes.back()); + classType = get<1>(attributes.back()); + attributes.pop_back(); + generateDataset(); + } else + throw invalid_argument("Unable to open file"); +} +void ArffFiles::generateDataset() +{ + X = vector>(lines.size(), vector(attributes.size())); + vector yy = vector(lines.size(), ""); + for (int i = 0; i < lines.size(); i++) { + stringstream ss(lines[i]); + string value; + int j = 0; + while (getline(ss, value, ',')) { + if (j == attributes.size()) { + yy[i] = value; + break; + } + X[i][j] = stof(value); + j++; + } + } + y = factorize(yy); +} +string ArffFiles::trim(const string& source) +{ + string s(source); + s.erase(0, s.find_first_not_of(" \n\r\t")); + s.erase(s.find_last_not_of(" \n\r\t") + 1); + return s; +} +vector ArffFiles::factorize(const vector& labels) +{ + vector yy; + yy.reserve(labels.size()); + map labelMap; + int i = 0; + for (string label : labels) { + if (labelMap.find(label) == labelMap.end()) { + labelMap[label] = i++; + } + yy.push_back(labelMap[label]); + } + return yy; +} \ No newline at end of file diff --git a/fimdlp/testcpp/xx/ArffFiles.h b/fimdlp/testcpp/xx/ArffFiles.h new file mode 100644 index 0000000..2788b84 --- /dev/null +++ b/fimdlp/testcpp/xx/ArffFiles.h @@ -0,0 +1,28 @@ +#ifndef ARFFFILES_H +#define ARFFFILES_H +#include +#include +#include +using namespace std; +class ArffFiles { +private: + vector lines; + vector> attributes; + string className, classType; + vector> X; + vector y; + void generateDataset(); +public: + ArffFiles(); + void load(string); + vector getLines(); + unsigned long int getSize(); + string getClassName(); + string getClassType(); + string trim(const string&); + vector>& getX(); + vector& getY(); + vector> getAttributes(); + vector factorize(const vector& labels); +}; +#endif \ No newline at end of file diff --git a/fimdlp/testcpp/xx/CMakeLists.txt b/fimdlp/testcpp/xx/CMakeLists.txt new file mode 100644 index 0000000..ba62e67 --- /dev/null +++ b/fimdlp/testcpp/xx/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.24) +project(main) + +set(CMAKE_CXX_STANDARD 17) + +add_executable(main main.cpp ArffFiles.cpp) diff --git a/fimdlp/testcpp/xx/main.cpp b/fimdlp/testcpp/xx/main.cpp new file mode 100644 index 0000000..b220199 --- /dev/null +++ b/fimdlp/testcpp/xx/main.cpp @@ -0,0 +1,30 @@ +#include "ArffFiles.h" +#include +#include +#include + +using namespace std; + +int main(int argc, char **argv) { + ArffFiles file; + vector lines; + //file.load("datasets/mfeat-factors.arff"); + file.load("/Users/rmontanana/Code/FImdlp/fimdlp/testcpp/datasets/mfeat-factors.arff"); + cout << "Number of lines: " << file.getSize() << endl; + cout << "Attributes: " << endl; + for (auto attribute: file.getAttributes()) { + cout << "Name: " << get<0>(attribute) << " Type: " << get<1>(attribute) << endl; + } + cout << "Class name: " << file.getClassName() << endl; + cout << "Class type: " << file.getClassType() << endl; + cout << "Data: " << endl; + vector> &X = file.getX(); + vector &y = file.getY(); + for (int i = 0; i < X.size(); i++) { + for (float value: X[i]) { + cout << fixed << setprecision(1) << value << " "; + } + cout << y[i] << endl; + } + return 0; +} diff --git a/sample.py b/sample.py index 7473635..c216e3e 100644 --- a/sample.py +++ b/sample.py @@ -4,7 +4,6 @@ from fimdlp.cppfimdlp import CFImdlp from sklearn.ensemble import RandomForestClassifier import numpy as np import time -from math import log2 from scipy.io import arff import pandas as pd @@ -44,65 +43,3 @@ print(test.get_cut_points()) clf = RandomForestClassifier(random_state=0) print(clf.fit(Xt, y).score(Xt, y)) print(Xt) -# for proposal in [True, False]: -# X = data.data -# y = data.target -# print("*** Proposal: ", proposal) -# test = CFImdlp(debug=True, proposal=proposal) -# test.fit(X[:, 0], y) -# result = test.get_cut_points() -# for item in result: -# print( -# f"Class={item['classNumber']} - ({item['start']:3d}, " -# f"{item['end']:3d}) -> ({item['fromValue']:3.1f}, " -# f"{item['toValue']:3.1f}]" -# ) -# print(test.get_discretized_values()) -# print("+" * 40) -# X = np.array( -# [ -# [5.1, 3.5, 1.4, 0.2], -# [5.2, 3.0, 1.4, 0.2], -# [5.3, 3.2, 1.3, 0.2], -# [5.4, 3.1, 1.5, 0.2], -# ] -# ) -# y = np.array([0, 0, 0, 1]) -# print(test.fit(X[:, 0], y).transform(X[:, 0])) -# result = test.get_cut_points() -# for item in result: -# print( -# f"Class={item['classNumber']} - ({item['start']:3d}, {item['end']:3d})" -# f" -> ({item['fromValue']:3.1f}, {item['toValue']:3.1f}]" -# ) -# print("*" * 40) -# # print(Xs, ys) -# # print("**********************") -# # test = [(0, 3), (4, 4), (5, 5), (6, 8), (9, 9)] -# # print(ys) -# # for start, end in test: -# # print("Testing ", start, end, ys[:end], ys[end:]) -# # print("Information gain: ", information_gain(ys, ys[:end], ys[end:])) -# # print(test.transform(X)) -# # print(X) -# # print(indices) -# # print(np.array(X)[indices]) - - -# # # k = test.cut_points(X[:, 0], y) -# # # print(k) -# # # k = test.cut_points_ant(X[:, 0], y) -# # # print(k) -# # # test.debug_points(X[:, 0], y) -# # X = [5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9] -# # y = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2] -# # indices = [4, 3, 6, 8, 2, 1, 5, 0, 9, 7] -# # clf = CFImdlp(debug=True, proposal=False) -# # clf.fit(X, y) -# # print(clf.get_cut_points()) -# # y = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2] -# # # To check -# # indices2 = np.argsort(X) -# # Xs = np.array(X)[indices2] -# # ys = np.array(y)[indices2] -# kdd_JapaneseVowels