From b33975437c080278d1f0a48e9cb241dc27d99ed6 Mon Sep 17 00:00:00 2001 From: SARTHAK Date: Mon, 6 Feb 2023 00:34:47 +0530 Subject: [PATCH] Added multinomial nb --- CMakeLists.txt | 5 +- examples/neighbors/bernoulli_nb.cpp | 3 +- examples/neighbors/multinomial_nb.cpp | 24 +++++ src/slowmokit.hpp | 1 + .../neighbors/bernoulli_nb/bernoulli_nb.cpp | 8 +- .../neighbors/bernoulli_nb/bernoulli_nb.hpp | 5 +- .../methods/neighbors/multinomial_nb.hpp | 13 +++ .../multinomial_nb/multinomial_nb.cpp | 100 ++++++++++++++++++ .../multinomial_nb/multinomial_nb.hpp | 25 +++++ 9 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 examples/neighbors/multinomial_nb.cpp create mode 100644 src/slowmokit/methods/neighbors/multinomial_nb.hpp create mode 100644 src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.cpp create mode 100644 src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b03d30..7781392 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,4 +39,7 @@ add_library(slowmokit src/slowmokit/methods/preprocessing/standardization.cpp src/slowmokit/methods/neighbors/bernoulli_nb.hpp src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.hpp - src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.cpp) \ No newline at end of file + src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.cpp + src/slowmokit/methods/neighbors/multinomial_nb.hpp + src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.hpp + src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.cpp) \ No newline at end of file diff --git a/examples/neighbors/bernoulli_nb.cpp b/examples/neighbors/bernoulli_nb.cpp index 0d00148..69caa4d 100644 --- a/examples/neighbors/bernoulli_nb.cpp +++ b/examples/neighbors/bernoulli_nb.cpp @@ -17,6 +17,7 @@ // std::vector yTrain{0,0,1,1,0,0,1,1,1,0}; // std::vector xTest{1,0,0}; // BernoulliNB bernoulli; -// std::cout<> xTrain{ +// {0,0,0}, +// {1,0,0}, +// {1,0,1}, +// {1,0,0}, +// {0,1,1}, +// {1,0,0}, +// {1,1,0}, +// {0,1,1}, +// {1,0,1}, +// {1,1,1} +// }; +// std::vector yTrain{2,2,2,2,1,2,2,1,2,0}; +// std::vector xTest{0,0,0}; +// std::vector classes{0,1,2}; +// MultinomialNB multinomial; +// multinomial.fit(xTrain,yTrain); +// std::cout< } template - int fit(std::vector> xTrain,std::vector yTrain,std::vector xTest){ + void fit(std::vector> xTrain,std::vector yTrain){ + this->xTrain = xTrain; + this->yTrain = yTrain; + } + +template + int fit_predict(std::vector xTest){ int nFeatures = xTrain[0].size(); std::vector postProbs; diff --git a/src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.hpp b/src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.hpp index 0df9b4c..1ffe1bc 100644 --- a/src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.hpp +++ b/src/slowmokit/methods/neighbors/bernoulli_nb/bernoulli_nb.hpp @@ -12,12 +12,15 @@ template class BernoulliNB{ private: + std::vector> xTrain; + std::vector yTrain; double prior_prob(std::vector yTrain,int label); double conditional_prob(std::vector> xTrain,std::vector yTrain,int featureCol,int featureVal,int label); public: // returns predicted value for each test according to bernoulli naive bayes model - int fit(std::vector> xTrain,std::vector yTrain,std::vector xTest); + void fit(std::vector> xTrain,std::vector yTrain) + int fit_predict(std::vector xTest); }; #endif \ No newline at end of file diff --git a/src/slowmokit/methods/neighbors/multinomial_nb.hpp b/src/slowmokit/methods/neighbors/multinomial_nb.hpp new file mode 100644 index 0000000..f0f6fc0 --- /dev/null +++ b/src/slowmokit/methods/neighbors/multinomial_nb.hpp @@ -0,0 +1,13 @@ +/** + * @file methods/neighbors/multinomial_nb.hpp + * + * Easy include for Multinomial Nb algorithm + */ + + +#ifndef SLOWMOKIT_MULTINOMIAL_NB_HPP +#define SLOWMOKIT_MULTINOMIAL_NB_HPP + +#include "multinomial_nb/multinomial_nb.hpp" + +#endif //SLOWMOKIT_MULTINOMIAL_NB_HPP \ No newline at end of file diff --git a/src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.cpp b/src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.cpp new file mode 100644 index 0000000..822e985 --- /dev/null +++ b/src/slowmokit/methods/neighbors/multinomial_nb/multinomial_nb.cpp @@ -0,0 +1,100 @@ +/** + * @file methods/neighbors/multinomial_nb/multinomial_nb.cpp + * + * Implementation of the Multinomial Naive Bayes main program + */ +#include "multinomial_nb.hpp" + +template + double priorProb(std::vector yTrain,int label){ // Prior-Probability P(y) + int sum=0; + for(int i=0;i + double conditionalProb(std::vector> xTrain,std::vector yTrain,int featureCol,int featureVal,int label){ // Conditional-Probabilty P(x=f1 / y=class) + int denominator=0,numerator=0; + std::set varies_values; + for(int i=0;i because if word do not exist in training but exist in testing + // denominator + number_of_different_values_in_feature + } + +template + void fit(std::vector> xTrain,std::vector yTrain,std::vector classes){ + this->xTrain = xTrain; + this->yTrain = yTrain; + this->classes = classes; + } + +template + int fit_predict(std::vector xTest){ + int n_features = xTrain[0].size(); + + std::vector postProbs; + + std::vector ::iterator label; // different ouput labels + for(label=classes.begin();label!=classes.end();label++){ // iterating over all labels (P(y=y1,y2,y3....)) + double likelihood=1.0; + for(int i=0;i Log10(P(x=x1 / y=label)) + } + + double prior = priorProb(yTrain,*label); + double post = prior*likelihood; + postProbs.push_back(post); + } + double sumpropProbs = 0.0; + int max=0; + for(int i=0;ipostProbs[max]){ + max = i; + } + } + return max; + }; + +signed main(){ + std::vector> x_train{ + {0,0,0}, + {1,0,0}, + {1,0,1}, + {1,0,0}, + {0,1,1}, + {1,0,0}, + {1,1,0}, + {0,1,1}, + {1,0,1}, + {1,1,1} + }; + std::vector y_train{2,2,2,2,1,2,2,1,2,0}; + std::vector x_test{0,0,0}; + std::vector classes{0,1,2}; + MultinomialNB multinomial; + multinomial.fit(x_train,y_train,classes); + std::cout< +class MultinomialNB{ +private: + std::vector> xTrain; + std::vector yTrain; + std::vector classes; + double priorProb(std::vector yTrain,int label); + double conditionalProb(std::vector> xTrain,std::vector yTrain,int featureCol,int featureVal,int label); +public: + void fit(std::vector> xTrain,std::vector yTrain,std::vector classes); + int fit_predict(std::vector xTest); +}; + +#endif \ No newline at end of file